碰撞检測


源码: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. 兼容浏览器 回车键 keydown事件

    $("body").keydown(function(event){   if(event.keyCode==13){   //body   } }); 重点:$("bo ...

  2. 【转】Unity3D研究院之DontDestroyOnLoad的坑

    http://www.xuanyusong.com/archives/2938 Unity中的一个方法DontDestroyOnLoad可以让某些游戏对象在切换场景的时候不是施放,听起来是一个非常好的 ...

  3. POJ 3481 Double Queue(Treap模板题)

    Double Queue Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15786   Accepted: 6998 Des ...

  4. HDU 1392 Surround the Trees(凸包入门)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  5. PE508

    真是日了苟了我之前还以为那个递归会炸状态..我真他妈胆小啊.. = = 明确一下,这个可以构成所有高斯整数(唯一),构造方法大概就是先看曼哈顿距离,然后判断要不要减1,然后再/(1-i) 我们考虑在末 ...

  6. css3上下翻页效果

    翻页效果显示当前时间 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  7. js 如何生成一个不重复的ID的函数

    在MongoDB中的ObjectID,可以理解为是一个不会重复的ID,这里有个链接http://www.jb51.net/article/101164.htm感兴趣可以去研究一下. 我今天要做的就是做 ...

  8. 小M的作物 最大权闭合子图

    题目大意 bzoj 3438 两个田\(A,B\) \(n\le 1000\)种作物的种子 第\(i\)个种子,种\(A\)价值\(a[i]\),种\(B\)价值\(b[i]\) 再给出\(m\)个子 ...

  9. [AGC06D] Median Pyramid Hard (玄学)

    Description 现在有一个N层的方块金字塔,从最顶层到最底层分别标号为1...N. 第i层恰好有2i−1个方块,且每一层的中心都是对齐的. 这是一个N=4的方块金字塔 现在,我们首先在最底层填 ...

  10. BZOJ 1497: [NOI2006]最大获利

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4572  Solved: 2239[Submit][Status] ...