iOS动画中的物理知识应用之愤慨的小鸟-碰撞检測
2017-04-25 15:37
323 查看
碰撞检測
源码: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动画中的物理知识应用之愤怒的小鸟-碰撞检测
- iOS动画中的物理知识应用之愤怒的小鸟-重力加速度
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- iOS狂暴之路---iOS的第一个应用中能学到哪些知识
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- iOS学习应用开发就业课:第7章_056:UIView动画基础
- iOS学习应用开发就业课:第7章_060:导航控制器动画
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- IOS 动画设计(5)——用缓动函数实现物理动画效果
- 数学/物理知识在软件/算法中应用(1)
- 【iOS开发系列】物理仿真动画UIDynamic (1)
- iOS财务管理、壁纸应用、带引线图表、导航栏、选择器、购物车动画等源码
- iOS高仿国美、二次元应用、点赞喷射动画、电影筛选页等源码
- Box2D物理碰撞基础知识
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- iOS 碰撞检測以及事件响应
- IOS的几种动画及其简单应用
- iOS 基本动画、关键帧动画、利用缓动函数实现物理动画效果
- iOS之HTTP和HTTPS的基本知识和应用
- 【与iOS开发息息相关的知识】1、iOS应用UI设计入门