iOS动画中的物理知识应用之愤慨的小鸟-碰撞检測
碰撞检測
源码: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动画中的物理知识应用之愤慨的小鸟-碰撞检測的更多相关文章
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
		
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
 - Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题
		
好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感 ...
 - Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測
		
事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖); // 0001 ); // 0001 ); // 0001 这样我们才干监听到它们的碰 ...
 - cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測
		
玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...
 - cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
		
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
 - iOS动画中的枚举UIViewAnimationOptions
		
若本帖转出“博客园”请注明出处(博客园·小八究):http://www.cnblogs.com/xiaobajiu/p/4084747.html 笔记 首先这个枚举属于UIViewAnimation. ...
 - (转发)IOS动画中的枚举UIViewAnimationOptions
		
若本帖转自(博客园·小八究):http://www.cnblogs.com/xiaobajiu/p/4084747.html 可怜目前天朝搜不到什么有价值的东西方便学习,在这里方便初学者. 首先这个枚 ...
 - 活到老学到老:iOS开发中的基础知识(一)
		
本文参考 标哥的博客:宝库iOS开发笔试题 进行学习整理.与其说是看面试题,不如说是对自己知识的巩固.工欲善其事必先利其器,基础知识不牢固可能会导致编程中的一些注意不到的问题.总之一句话:活到老,学到 ...
 - iOS编程中的音频知识(二):那么多种格式我应该用哪一个?
		
iPhone支持不少格式,比如AAC,HE-AAC,AMR,IMA4等等,你可以在以下网址看到比较全的格式和简要介绍: http://www.raywenderlich.com/69365/audio ...
 
随机推荐
- 菜鸟之路——git学习及GitHub的使用
			
首先,感谢廖雪峰老师的git教程 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ...
 - pb8.0 mssqlserver 新建数据库连接问题
			
将ntwdblib.DLL复制到Sybase\Shared\PowerBuilder目录下 unable to load the requested database interface,无法创建数据 ...
 - Javascript 表达式和运算符
			
属性访问表达式: var o = {x:1, y:{z:3}};//示例对象 var a = [o, 4, [5,6]];//包含对象的数组 console.log(o["x"]) ...
 - RQNOJ 明明的随机数
			
题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应 ...
 - 【bzoj2946】[Poi2000]公共串 后缀自动机
			
[Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1386 Solved: 620[Submit][Status][Discus ...
 - 洛谷  P1362  兔子数
			
题目描述 设 S(N ) 表示 N 的各位数字之和,如 S(484) = 4+8+4 = 16, S(22) = 2+2 = 4.如果一个正整数满足 S(x*x) = S(x) *S(x),我们称之为 ...
 - set基本用法---1
			
#include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #inclu ...
 - jQuery 拖动排序
			
原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html><html lang="en">< ...
 - android基本控件学习-----ProgressBar
			
ProgressBar(进度条)讲解 一.常用属性和基础使用实例 (1)常用属性: android:max:进度条的最大值 android:progress:进度条已完成进度值 android:pro ...
 - [Oracle] Redo&Undo梳理
			
Oracle Redo&undo Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要 ...