【愤怒的小方块案例 Objective-C语言】

news2024/12/22 22:59:51

一、我们来做这个愤怒的小方块啊,

通知

1.我们新建一个项目,

通知

Name:18-愤怒的小方块,

通知

Dynamic,不能够处理圆形的View,Dynamic都是方的,如果你想处理圆的View的话,需要用另外一个东西,什么Kit,专门做游戏的一个iOS框架,

通知

首先,我们把这个项目的竖屏,去掉勾选,只留一个Landscape Left,

通知

2.接下来,我们去创建一个UIView,一个红色的View,先让它一拖拽,能够飞起来,再去考虑蓝色的View,碰撞的问题,

这个思路,大概是这个样子的,首先,有一个拖拽的手势,

通知

超出了一个圆形的范围以后,它就不能够再拖拽了,

通知

我之前跟大家说的那个CGPath包含某一个点,它超过某一个圆形的区域,就不能够再拖拽了,如果你在圆形的区域里边撒手的话,看一下我手指的这个位置,跟你这个View一开始的中心,我这儿加了一个小黑点儿,看着方便一些,跟我中间的这个距离,是多少,然后我的推力也会依次的变大,

这个红色的View,本身带一个重力,到时候你往外扔的时候,它会自动的落下来,

还有这个方向的问题,也是算一个偏移量,把它用向量的形式取一个反,让它往反方向去推,推完了以后,再带一个重力,它就会落下来,

3.// 添加小鸟

通知

UIView *bird = [[UIView alloc] init];

bird.frame = CGRectMake(150,250,30,30);

bird.backgroundColor = [UIColor redColor];

[self.view addSubview:bird];

通知

command + R,

通知

4.我要去拖拽这个红色的View,

我要去给这个红色的View添加一个手势,

// 为小鸟添加一个拖拽的手势

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc ] initWithTarget:self action:@selector(pan:)];

通知

接下来,去添加,给这个View添加,

[bird addGestureRecognizer:pan];

通知

5.// 实现小鸟拖拽的方法

- (void)pan:(UIPanGestureRecognizer *)sender{

}

通知

我直接改它的Transform,

通知

之前讲拖拽手势,不是有一个图片吗,图片我们直接通过它的translate有一个方法,可以拿到它每一次的偏移量,然后,这个偏移量,只是在它自身、红色View的translate基础上去累加,去加这个偏移量,然后,最后不要忘了那个归零的操作,

1)// 获取移动的偏移量

[sender translationInView:sender.view];

通知

看看这个View到底移动了多少,

写一个CGPoint offset = [sender translationInView:sender.view];

通知

然后呢,这个偏移量有了以后,我们再去把它,改变一下transform,

// 改变红色View的transform

然后,红色的View,在这儿怎么样去拿,self.bird?sender.view,是不是也是一样的,

在这儿你可以搞一个全局的,或者sender.view,也是一样的,

我们是在累加,所以,不要用Make,

不用Make的话,会有问题,你再清一个零,问题就解决了,

sender.view.transform = CGAffineTransform

通知

sender.view.transform = CGAffineTransform(sender.view.transform,offset.x,offset.y);

通知

// 归0

[sender setTranslation:CGPointZero inView:sender.view];

通知

command + R,

通知

拖拽搞定,

6.如果超出了以之前的View.center,半径是100的范围,那就不让你再去拖拽了,你就直接在这个pan:方法里边,return,就完了,

通知

首先啊,我这个距离,应该怎么着去计算,

通知

首先,红色View的Center是有的,然后呢,我现在偏移量,我也是可以求出来的,

就是我当前新的手指的位置,肯定也会获取到的,

我获取到以后,就可以去计算出来,我这个当前手指的位置,跟我之前这个红色View的Center,的偏移量,

那有了这个偏移量,我要算它们两个的距离,怎么算,

对,勾股定理嘛,勾三、股四、玄五,

通知

假设,红色的View之前在这儿,然后,我把它拖到了黄色方块儿的位置,我可以计算出之前红色View的Center,和我这个黄色方块儿的Center之间的偏移量,这两个黄色箭头的距离,可以算出来,

我现在要求的是,这个距离,

通知

能算出来吧,对吧,它的平方 + 它的平方,再开方,

就可以了吧,

接下来,我们去计算这个距离,那计算距离之前呢,我要有偏移量,

有X变了多少,Y变了多少,

通知

那么,这个offset,能用吗,不能吧,这是增加量,这个offset我们是一直在归零的,

通知

想想我们之前在讲旋转的时候,我们直接输出的话,是从0开始,一点儿一点儿的去累加,如果我们归零了以后,是不是只是在去输出它的夹角,

实际上,当前的这个偏移量,也是一样的,它输出的应该就是0啊,1啊,这些,

输出一下试试:

NSLog(@“%@”,NSStringFromCGPoint(offset));

通知

实际上,它输出的,只是我每一次拖动的增量,

通知

也就是0、1、2、3、4、5啊,也就这么大了,除非我拖的很快,

反正它这个offset,肯定是不能用的,

它不是一共拖了多少,而是每一次,跟上一次相比,拖了多少,

那这个时候,怎么办,累加,累加是不是还要保存啊,有没有别的办法,

好,我们说,我们之前在用touchBegan:touchMove:的时候,我们调用的获取手指的位置,叫做locationInView:

然后呢,这个方法叫什么,translationInView:

通知

Translation是什么,是你移动了多少,

sender里边还有一个locationInView:

通知

这个locationInView:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThreeJS-3D教学十四:ShaderMaterial(length、fract、step)

length() 内置函数可以获取向量的长度, 这里用 vUv 计算每个像素离原点(0.0, 0.0)位置的距离 dist,将其设置到颜色上, 会得到圆心在左下角的1/4渐变圆形效果,左上角(0.0, 1.0)和右下角(1.0, 0.0)离原点距离都是1, 对应…

雷池WAF+Modsecurity安装防护及系统加固

君衍. 一、雷池WAF1、什么是雷池2、什么是WAF3、雷池的功能4、WAF部署架构5、整体检测流程 二、雷池WAF环境依赖1、查看本地CPU架构2、Docker安装2.1 卸载旧版本2.2 安装yum-utils工具包2.3 设置镜像仓库2.4 安装docker2.5 启动docker并查看版本 3、Docker Compose安装3.1 卸载…

flex布局中子元素内容超出时,子元素本身出现滚动条实现方法

flex布局中子元素宽度平均分配,并且当子元素内容超出时,子元素本身出现滚动条实现方法: 将父元素设置为display: flex,以启用Flexbox布局。将每个子元素的flex属性设置为1,以使其宽度平均分配。设置子元素的overflow属…

《Linux开发笔记》C语言编译过程

C语言编译过程 编译过程主要分为四步:预处理、编译、汇编、链接 预处理:主要用于查找头文件、展开宏 编译:把.i文件编译成.s文件 汇编:把.s文件汇编为.o文件 链接:把多个.o文件链接成一个app 以上四个步骤主要由3个命…

MySQL常用操作命令大全

文章目录 一、连接与断开数据库1.1 连接数据库1.2 选择数据库1.3 断开数据库 二、数据库操作2.1 创建数据库2.2 查看数据库列表2.3 删除数据库 三、表操作3.1 创建表3.2 查看表结构3.3 修改表结构3.3.1 添加列3.3.2 删除列3.3.3 修改列数据类型 3.4 删除表 四、数据操作4.1 插入…

一文讲懂npm link

前言 在本地开发npm模块的时候,我们可以使用npm link命令,将npm 模块链接到对应的运行项目中去,方便地对模块进行调试和测试 用法 包链接是一个两步过程: 1.为依赖项创建全局软链npm link。一个符号链接,简称软链&a…

DataWhale-吃瓜教程学习笔记 (六)

学习视频**:第4章-决策树_哔哩哔哩_bilibili 西瓜书对应章节: 第五章 5.1;5.2;5.3 文章目录 MP 神经元- 感知机模型 (分类模型)-- 损失函数定义--- 感知机学习算法 - 随机梯度下降法 - 神经网络需要解决的问…

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址: GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…

HBM是什么?因AI而崛起,它有哪些优势?

南韩存储大厂SK海力士宣布,将与台积电公司密切合作,联手生产下一代HBM——即预计在2026年投产的第六代HBM产品HBM4,双方并于近期签署合作备忘录(MOU)。 SK海力士以往的HBM产品,包括HBM3E(第五代…

感动的短视频:成都柏煜文化传媒有限公司

感动的短视频:瞬间触动心灵的温暖力量 在这个快节奏、高压力的时代,我们常常在忙碌与喧嚣中穿梭,心灵深处那份最纯粹的感动似乎变得愈发珍贵而难得。然而,就在这样一个数字化盛行的今天,短视频以其独特的魅力&#xf…

LLM学习记录

概述 语言模型的发展 语言模型经历过四个阶段的发展,依次从统计语言模型到神经网络语言模型(NLM),到出现以 BERT 和 Transformer 架构为代表的预训练语言模型(PLM),最终到大型语言模型阶段&am…

第一后裔怎么绑定NEXON账号 NEXON账号绑定Steam第一后裔教程

刚上线就特别好评的多人刷榜刚上线就特别好评的多人刷宝射击爽游《第一后裔》免费上线了,快和小伙伴们一起来闯荡这个神秘的世界吧,整体还是mmo的玩法,开放世界任意探索,全新虚幻五引擎带来的不俗的画面表现,在游戏中扮…

Sharding-JDBC分库分表的基本使用

前言 传统的小型应用通常一个项目一个数据库,单表的数据量在百万以内,对于数据库的操作不会成为系统性能的瓶颈。但是对于互联网应用,单表的数据量动辄上千万、上亿,此时通过数据库优化、索引优化等手段,对数据库操作…

昇思25天学习打卡营第04天 | 数据集 Dataset

昇思25天学习打卡营第04天 | 数据集 Dataset 文章目录 昇思25天学习打卡营第04天 | 数据集 Dataset数据集加载数据集迭代数据集的变换shufflemapbatch 自定义数据集可随机访问数据集对象可迭代数据集生成器 总结打卡 数据集Dataset对原始数据进行封装、变换,为神经网…

OpenSSH漏洞扫描(CVE-2024-6387、CVE-2006-5051、CVE-2008-4109)

目录 POC:ssh_poc.py 使用方法 github CVE-2024-6387 漏洞信息 补丁 POC:ssh_poc.py import sys import socket import argparse import threading import queue import os from datetime import datetime from urllib.parse import urlparse from…

全年免费!环信发布出海创新版,助力泛娱乐创业者扬帆起航

目前,以陌生人社交、直播、语聊、电商等热门场景为代表的社交泛娱乐出海正发展得如火如荼,成为企业新的增长曲线。但随着出海企业增多,海外市场争夺、资源竞争与技术博弈也愈加激烈。 为了让更多创业者与创新者获得支持,快速高效…

宠物博主亲测养宠好物安利,口碑好的狗毛空气净化器推荐

作为一名6年资深铲屎官,一到春季换季就开始各种疯狂打喷嚏、全身过敏红肿,这是因为宠物在换季的时候就疯狂掉毛,家里就想下雪一样,空气中都是宠物浮毛。而宠物毛上附带的细菌会跟随浮毛被人吸入人体,从而产生打喷嚏、过…

VBA字典与数组第十六讲:行、列数不相同的数组间运算规律

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。…

云服务器中的地域和可用区是什么意思?

一、地域介绍 1、概念 地域(Region):从地理位置和网络时延维度划分,同一个地域内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。不同地域之间完全隔离,保证不同地域间最大程度的稳定性和容…

0628_ARM4

练习&#xff1a; stm32流水灯 .text .global _start _start: 使能GPIOE外设时钟 0X50000A28 RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 指定操作的内存地址 LDR R1,[R0] 将R0对应的地址空间中的值读取出来 ORR R1,R1,#(0x3<<4) 将第4,5位设置为1 STR…