一、我们来做这个愤怒的小方块啊,
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: