碰撞检測


源码:https://github.com/Esdeath/collsion


我相信搞iOS得人。多多少少都知道 弹球这个小游戏。

撞击不同的点,就能改变其运动的轨迹。对于非常多人来说,假设不知道思路可能认为小球在屏幕中撞来撞去,碰到墙壁就改变运动方向似乎非常难实现。

事实上这个仅仅须要一点点iOS画图基础和动画基础,还要一点点物理知识就OK了。

1.速度和位移都是矢量

在2D坐标系中,速度和位移都能分解成在x轴和y轴上的分量



所以能够依据速度在Vx 和 Vy来描写叙述物体的运动情况。

界面每次刷新单位时间。利用物体速度分量Vx与Vy的值来计算下次物体出现的位置:

  • 下次X轴坐标=Vx + 当前X轴坐标
  • 下次Y轴坐标=Vy + 当前Y轴坐标

2.碰撞的速度模型



假设物体撞到屏幕的底边,这时候物体在X轴上的方向不变。y轴方向上速度取反,同理撞到屏幕顶边也是。

物理模型:

  • Vx = Vx
  • Vy = - Vy

同理,假设物体撞到左边或者右边:

  • Vx = - Vx
  • Vy = Vy

3.代码实现

1.新建一个MRView加入到根View上。

2.加入CADisplayLink

CADisplayLink是一个能让我们以和屏幕刷新率同样的频率将内容画到屏幕上的定时器。

我们在应用中创建一个新的 CADisplayLink 对象,把它加入到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用。

CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

3.设置成员属性

//小鸟图片
@property (nonatomic,strong) UIImage *imageBird;
//小鸟的位置
@property (nonatomic,assign) CGFloat birdX;
@property (nonatomic,assign) CGFloat birdY;
//小鸟的速度
@property (nonatomic,assign) CGFloat birdSpeedX;
@property (nonatomic,assign) CGFloat birdSpeedY;

4.初始化

这里要注意,要设置从xib,storyboard,还有代码中初始化都必须引用到。

CADisplayLink中调用setNeedsDisplay用来不停的重绘。

//从xib或者storyboard初始化调用
- (void)awakeFromNib
{
[self setUpBird];
}
//从代码初始化调用这个
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self setUpBird];
} return self;
} -(void)setUpBird
{
self.backgroundColor = [UIColor blackColor]; CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; self.imageBird = [UIImage imageNamed:@"QQ20150714-1"];
//设置初始位置
self.birdX = 1;
self.birdY = 1;
//设置初始速度
self.birdSpeedX = 5;
self.birdSpeedY = 5;
}

5.画图

主要是推断好。小鸟碰撞四周的时候速度反向

- (void)drawRect:(CGRect)rect
{
[self.imageBird drawInRect:CGRectMake(self.birdX , self.birdY, IMAGEWIDTH, IMAGEHEIGHT)]; if (self.birdX < 0 || (self.birdX > SCREENWIDTH - IMAGEWIDTH) )
{
self.birdSpeedX = -self.birdSpeedX;
} if (self.birdY < 0 || (self.birdY > SCREENHEIGHT - IMAGEHEIGHT) )
{
self.birdSpeedY = -self.birdSpeedY;
} self.birdX += self.birdSpeedX;
self.birdY += self.birdSpeedY;
}

6.完整的代码

这里MRView是self.view的子控件。

全然覆盖self.view

#import "MRView.h"

#define SCREENHEIGHT   [UIScreen mainScreen].bounds.size.height
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width #define IMAGEWIDTH 50
#define IMAGEHEIGHT 50 @interface MRView() @property (nonatomic,strong) UIImage *imageBird;
//小鸟的位置
@property (nonatomic,assign) CGFloat birdX;
@property (nonatomic,assign) CGFloat birdY;
//小鸟的速度
@property (nonatomic,assign) CGFloat birdSpeedX;
@property (nonatomic,assign) CGFloat birdSpeedY; @end @implementation MRView
- (void)awakeFromNib
{
[self setUpBird];
} - (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self setUpBird];
} return self;
} -(void)setUpBird
{
self.backgroundColor = [UIColor blackColor]; CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; self.imageBird = [UIImage imageNamed:@"QQ20150714-1"];
//设置初始位置
self.birdX = 1;
self.birdY = 1;
//设置初始速度
self.birdSpeedX = 5;
self.birdSpeedY = 5;
} - (void)drawRect:(CGRect)rect
{
[self.imageBird drawInRect:CGRectMake(self.birdX , self.birdY, IMAGEWIDTH, IMAGEHEIGHT)]; if (self.birdX < 0 || (self.birdX > SCREENWIDTH - IMAGEWIDTH) )
{
self.birdSpeedX = -self.birdSpeedX;
} if (self.birdY < 0 || (self.birdY > SCREENHEIGHT - IMAGEHEIGHT) )
{
self.birdSpeedY = -self.birdSpeedY;
} self.birdX += self.birdSpeedX;
self.birdY += self.birdSpeedY;
} @end

7.结果展示

iOS动画中的物理知识应用之愤慨的小鸟-碰撞检測的更多相关文章

  1. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  2. Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题

    好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感 ...

  3. Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測

    事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖);    // 0001 );   // 0001 ); // 0001 这样我们才干监听到它们的碰 ...

  4. cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測

    玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...

  5. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  6. iOS动画中的枚举UIViewAnimationOptions

    若本帖转出“博客园”请注明出处(博客园·小八究):http://www.cnblogs.com/xiaobajiu/p/4084747.html 笔记 首先这个枚举属于UIViewAnimation. ...

  7. (转发)IOS动画中的枚举UIViewAnimationOptions

    若本帖转自(博客园·小八究):http://www.cnblogs.com/xiaobajiu/p/4084747.html 可怜目前天朝搜不到什么有价值的东西方便学习,在这里方便初学者. 首先这个枚 ...

  8. 活到老学到老:iOS开发中的基础知识(一)

    本文参考 标哥的博客:宝库iOS开发笔试题 进行学习整理.与其说是看面试题,不如说是对自己知识的巩固.工欲善其事必先利其器,基础知识不牢固可能会导致编程中的一些注意不到的问题.总之一句话:活到老,学到 ...

  9. iOS编程中的音频知识(二):那么多种格式我应该用哪一个?

    iPhone支持不少格式,比如AAC,HE-AAC,AMR,IMA4等等,你可以在以下网址看到比较全的格式和简要介绍: http://www.raywenderlich.com/69365/audio ...

随机推荐

  1. [oldboy-django][4python面试]面试前需要熟练掌握的知识点(待更新)

    python基础 - 生成器 - 装饰器 - 迭代器 - 列表生成式 - 引用,传参 - 面向对象,继承 前端Html: - 词法分析 - 作用域 - 语法分析 - this - Jsonp mysq ...

  2. centos7 mariadb mysql max_connections=214 无法修改的问题

    centos7 mariadb mysql max_connections=214 无法修改的问题 /etc/my.cnf.d/mariadb-server.cnf [mysqld] max_conn ...

  3. jQuery动画的hover连续触发动画bug处理

    一.问题 为元素设置hover上实现动画的效果,当鼠标反复快速进入元素时,动画会在鼠标停止后依然执行,导致动画和鼠标的动作不一致. 二.解决方法 要解决这种问题,可以使用jquery的stop()方法 ...

  4. 低水平选手的自我救赎 (1)CLRS Exercise 16.5-2

    题目大意 给定正整数 $n$ 和一个由 $m$ 个正整数构成的可重集合 $A$,满足 $\forall a\in A, a\le n$ 且 $m\le n$ . 定义 $N_t(A) = |\{a\i ...

  5. ZOJ 3780 Paint the Grid Again(隐式图拓扑排序)

    Paint the Grid Again Time Limit: 2 Seconds      Memory Limit: 65536 KB Leo has a grid with N × N cel ...

  6. 关于可图化序列的一点结论 NEU 1429

    Graphic Sequence A graphic sequence is a sequence of numbers which can be the degree sequence of som ...

  7. 调试Java代码(Eclipse)汇总

    Java 10个调试技巧(基础❤❤❤❤❤) Eclipse断点调试(和上一篇基本类似,补充❤❤) 使用Eclipse开发和调试java程序(从安装eclipse开始,特别细,有设置条件断点,回退的具体 ...

  8. OpenJudge 2971 抓住那头牛

    总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0< ...

  9. 【CF1073B】Vasya and Books(模拟)

    题意:给你一个栈里书的编号,每次能捞出栈顶的一本书,每次询问捞出某本编号的书需要捞几次 n<=2e5 思路: #include<cstdio> #include<cstring ...

  10. 【BZOJ4476&JSOI2015】送礼物(二分,RMQ)

    ANS明显是有二分性的 二分答案,设二分值为b M(i,j)−m(i,j)j−i+k>b 显然当l<长度<r时,一端是最小值,一端是最大值. 等于l或r的时候因为可能不满足以上性质, ...