iOS動畫中的物理知識應用之憤怒的小鳥-重力加速度
平拋運動
還記得初次玩憤怒的小鳥的時候,彈出小鳥那一瞬間,小鳥在空中划出的優美弧線嗎?還記得小鳥在地上彈起又落下的情境嗎?這裡就介紹一下如何?平拋運動。
1.平拋運動的物理知識
vc/ytcTL2bbI1Nqx5LTzo6i67MmrvP3Nt7XEs6S2yKOpoaM8YnIgLz4NCtPJu/mxvrXEzu/A7daqyrbO0sPH1qq1wKO6PC9wPg0KVnggPSBWeCBWeSA9IFZ5ICsgYXQNCjxwPtTavMbL47v61tC9+NDQxKPE4rXEyrG68qOsztLDx7/J0tTIz86qdMrH0ru49rWlzrvKsbzko6zL+dLU1NpZ1uG3vc/yyc9WeSA9IFZ5ICsgYaGj1eLA787Sw8e/ydLUuPhhyKHSu7j2s6PBv6Osse3KvrzTy9m2yNa1oaPP1sq1yfq77tbQYSA9IDkuOKOou/LV3zEwo6mhozwvcD4NCjxwPtTa1eK49sD919PW0KO60KHE8b2rvt/T0Muuxr23vc/ytcSz9cvZtsijrMfSyty1vc/yz8K1xNbYwaajrLy00KHE8b7f09DP8s/CtcS808vZtsijrMj0xfa1vbXYw+a+zbvhvfjQ0Le0ta+jrMvZtsi3tM/yoaM8L3A+DQo8aDMgaWQ9"2代碼實現">2.代碼實現1.設定初始量
- (void)setUpStartValue{ //在螢幕上的初始位置 self.birdX = 0; self.birdY = 0; //x,y軸上的初始速度 self.birdSpeedX = 10; self.birdSpeedY = 0; //重力加速度 self.gBirdSpeed = 9.8;}
2.類比重力環境的核心代碼
//在x軸上速度不變,每次重新整理的時候,x軸上的位置等於速度,加上前一個位置 self.birdX += self.birdSpeedX; //在y軸上每次重新整理,小鳥的速度增加一個重力加速度 self.birdSpeedY += self.gBirdSpeed; //y軸上的位置等於y軸上增加後的速度,加上前一個位置 self.birdY += self.birdSpeedY; //碰到x軸螢幕邊緣,在x軸上的位置不在發生變化 if (self.birdX >= SCREENWIDTH - IMAGEWIDTH) { self.birdX = SCREENWIDTH - IMAGEWIDTH; } //判斷是否觸地,如果觸碰到視窗邊界,Vy調整為相反方向 if(self.birdY >= SCREENHEIGHT - IMAGEHEIGHT) { self.birdY = SCREENHEIGHT - IMAGEHEIGHT; self.birdSpeedY = -self.birdSpeedY; }
3.項目的完整代碼
#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 *imageBackgound;@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;@property (nonatomic,assign) CGFloat gBirdSpeed;@end@implementation MRView- (void)awakeFromNib{ self.contentMode = UIViewContentModeRedraw; self.backgroundColor = [UIColor blackColor]; [self setUpStartValue];}- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { [self setUpStartValue]; } return self;}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self setUpStartValue]; CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)]; [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];}- (void)setUpStartValue{ self.imageBackgound = [UIImage imageNamed:@IMG_0465.jpg]; self.imageBird = [UIImage imageNamed:@QQ20150714-1]; self.birdX = 0; self.birdY = 0; self.birdSpeedX = 10; self.birdSpeedY = 0; self.gBirdSpeed = 9;}- (void)drawRect:(CGRect)rect{ [self.imageBird drawInRect:CGRectMake(self.birdX, self.birdY, IMAGEWIDTH,IMAGEHEIGHT)]; //在x軸上速度不變,每次重新整理的時候,x軸上的位置等於速度,加上前一個位置 self.birdX += self.birdSpeedX; //在y軸上每次重新整理,小鳥的速度增加一個重力加速度 self.birdSpeedY += self.gBirdSpeed; //y軸上的位置等於y軸上增加後的速度,加上前一個位置 self.birdY += self.birdSpeedY; //碰到x軸螢幕邊緣,在x軸上的位置不在發生變化 if (self.birdX >= SCREENWIDTH - IMAGEWIDTH) { self.birdX = SCREENWIDTH - IMAGEWIDTH; } //判斷是否觸地,如果觸碰到視窗邊界,Vy調整為相反方向 if(self.birdY >= SCREENHEIGHT - IMAGEHEIGHT) { self.birdY = SCREENHEIGHT - IMAGEHEIGHT; self.birdSpeedY = -self.birdSpeedY; }}@end
4.運行結果