Создаем клон игры Flappy Bird используя движок физики iOS7

от автора

#FlappyBird — И этим все сказано!

Эта игрушка невероятно проста, но в тоже время содержит добротную смесь развлечения и негодования присущее играм 90-х, таким как Double Dragon 3, и Teenage Mutant Ninja Turtles. После того как Dong Nguyen объявил о том, что собирается убрать игру из app store, мне стало интересно насколько сложно воссоздать физику и взаимодействие с помощью нового физического движка iOS7. Я написал эту статью потому, что многие разработчики даже не знают, что IOS 7 имеет встроенный физический движок — UIKit Dynamics.

1. Взмахи

Реализация содержит три шага. Во-первых, необходимо создать распознание жеста прикосновения:

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)]; [self.view addGestureRecognizer:singleTapGestureRecognizer]; [singleTapGestureRecognizer setNumberOfTapsRequired:1]; 

Следующим этапом мы должны создать взмахи «птички». Создаем постоянный вектор flapUp (вверх):

flapUp = [[UIPushBehavior alloc] initWithItems:@[self.block] mode:UIPushBehaviorModeInstantaneous]; flapUp.pushDirection = CGVectorMake(0, -1.1); flapUp.active = NO; 

И напоследок, добавляем гравитацию на «птичку».

gravity = [[UIGravityBehavior alloc] initWithItems:@[self.block]]; gravity.magnitude = 1.1; 

Вот так будет двигаться наша «птичка»:

Двигающиеся трубы.

Реализация труб тоже достаточно проста. Надо создавать их вне экрана и начинать двигать с правой стороны к левой с негативной силой X. Создаем трубы и придаем им плотность.

pipesDynamicProperties= [[UIDynamicItemBehavior alloc] initWithItems:@[topPipe, bottomPipe]]; pipesDynamicProperties.allowsRotation = NO; pipesDynamicProperties.density = 1000;

Трубы созданы, а теперь пусть побегают по экрану.

movePipes = [[UIPushBehavior alloc] initWithItems:@[topPipe, bottomPipe] mode:UIPushBehaviorModeInstantaneous]; movePipes.pushDirection = CGVectorMake(-2800, 0); movePipes.active = YES; 

И это будет выглядеть примерно так:

Умираем при коллизиях

Последним шагом будет добавление момента проигрыша при коллизии с объектами. Стоит обратить внимание на левую границу на экране. При коллизии, она убирает трубы, а также вызывает код для генерации новых.

blockCollision = [[UICollisionBehavior alloc] initWithItems:@[self.block]]; [blockCollision addBoundaryWithIdentifier:@"LEFT_WALL" fromPoint:CGPointMake(-1*PIPE_WIDTH, 0) toPoint:CGPointMake(-1*PIPE_WIDTH, self.view.bounds.size.height)]; blockCollision.collisionDelegate = self;

Добавляем коллизию между «птичкой» и землей.

groundCollision = [[UICollisionBehavior alloc] initWithItems:@[self.block, self.ground]]; groundCollision.collisionDelegate = self;

И в конце-концов, после того как созданы трубы, мы должны добавить коллизию между трубами и «птичкой».

[blockCollision addItem:topPipe]; [blockCollision addItem:bottomPipe]; 

Так как трубы и земля — это один и тоже делегат self, то все что касается «птички» вызывает «Game Over». Теперь коллизии добавлены между «птичкой» и землей, а также «птичкой» и динамически создаваемыми трубами. Вот как это выглядит:

Исходные коды доступны на GitHub под лицензией MIT для тех, кто хочет научиться пользоваться физическим движком iOS7. Вы можете посмотреть исходники тут: github.com/joeblau/FlappyBlock

ссылка на оригинал статьи http://habrahabr.ru/company/masterup/blog/212295/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *