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

http://blog.joeblau.com/flappy-block
  • Перевод
#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
Метки:
Master UP 25,84
Компания
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Похожие публикации
Комментарии 24
  • +31
    Flappy Bird в тридцать строк
    • –10
      Ура, теперь можно выставлять айфон за 800 долларов на ибее.
      • +4
        Никто же его не купит, раз все сами могут сделать себе свой FlappyBird
      • 0
        @implementation JBViewController {
          UIView *pipeBounds;
          UIDynamicAnimator *blockAnimator;
          
          UICollisionBehavior *blockCollision;
          UICollisionBehavior *groundCollision;
          UIDynamicItemBehavior *blockDynamicProperties;
          UIDynamicItemBehavior *pipesDynamicProperties;
          UIGravityBehavior *gravity;
          UIPushBehavior *flapUp;
          UIPushBehavior *movePipes;
          int points2x;
          int lastYOffset;
          UIAlertView *gameOver;
          
          Boolean firstFlap;
        }
        ...
        

        Ничего себе, получается что переменные класса теперь можно объявлять внутри @implementation? Когда это появилось?
        • +4
          уже года два точно можно, просто это довольно малоизвестный факт
          • +1
            Года 2, может и 3 назад. :)
          • +26
            Ух ты, целый движок (который к тому же глючный и неработающий) для двух строчек кода.
            v+=a*deltaT;
            y+=v*deltaT;
            bird.center = CGPointMake(100,y);
            
            • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              И ещё, интересно, насколько хороши SpriteKit, UI***Behavior и другие новые «игровые» API iOS 7.0 для разработки 2d игр? Насколько они могут заменить Cocos2d + box2d и их аналоги?
              • 0
                Официальная точка зрения Apple примерно такова:
                SpriteKit можно использовать только для простых анимаций. Для более-менее нормальных игр лучше использовать те же Cocos2d и прочие в силу их более лучшей оптимизации. У SpriteKit сложности начнут появляться когда на сцене будет большое количество объектов или усложнится взаимодействие.

                • 0
                  Тут я не совсем согласен. Я делал демку в которой сравнивал SpriteKit vs. Cocos2D под большой нагрузкой (200+ объектов на сцене).
                  Так вот визуально на одинаковых устройствах все выглядит идентично, но по памяти SpriteKit выигрывает в десятки раз. Попробую скриншот найти. По сути под капотом для физики там в обоих случаях Box2D.
                  • 0
                    Соглашаться или нет — это дело каждого. Я просто добавил мнение Apple, которое они обычно высказывают в процессе знакомства со SpriteKit. К сожалению, я не уточнял у них больше подробностей для этого, так как у меня больше утилитарные приложения и играми не особо занимаюсь. Хотя, наверно, надо было. Может, в следующий раз спрошу.
                    В любом случае они обещали развитие проекта и, возможно, потом будет лучше. Хотя, и более специализированные framework'и тоже на месте не стоят.
                  • 0
                    Где можно ознакомиться с этой точкой зрения? Возникло ощущение, что Вы UIKit со SpriteKit перепутали.

                    вот статья от Apple по созданию довольно симпатичной игры:
                    developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/CodeExplainedAdventure/AdventureArchitecture/AdventureArchitecture.html

                    вот небольшой пример, с анимацией 10000 спрайтов на 60 fps:
                    www.sdkboy.com/?p=386
                    • 0
                      Кстати, действительно, мог спутать, так как был заинтересован другими темами в тот момент. Судя по тестам, так оно и есть.
                      • 0
                        Да, в iOs 7 добавили UIKit Dynamics для эффектов физики в стандартном интерфейсе на UIKit. Статья использует UIKit и это действительно будет медленно в более-менее сложной игре. Видимо, его использовали для простоты. А также в iOs 7 добавили SpriteKit со своей физикой, для создания игр. И это подходит для игр и является заменой Cocos 2D.
                • +19
                  Не рекламы ради, у Flappy Bird есть куда более интересный и красочный аналог — BadLand
                  image
                  • +2
                    К тому же отличное развлечение, если вас четверо и есть планшет.
                    • +1
                      Игра красивая, но мало что имеет общего с Flappy Bird, только управление одним пальцем. У BadLand: есть уровни, нормальная сложность, надо иногда подумать как пройти и самое главное — она не вызывает приступов ярости.
                      • 0
                        она не вызывает приступов ярости

                        Ну, не скажите) Прошел всю игру — иногда так раздражает, когда 10 раз подряд попадаешь в одну и ту же ловушку и понятия не имеешь, как ее обойти, а потом замечаешь маленький рычажок/кнопочку
                    • +2
                      Сразу вспомнил WWDC


                      • –5
                        Мой текущий рекорд в Flappy Birds — 72 :-)

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое