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

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

通知

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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值