Статьи

Создайте игру на самолете с набором спрайтов — взрывы и облака

Из этого туториала вы узнаете, как использовать среду Sprite Kit для создания простой игры «Самолеты». По пути вы узнаете все основные концепции Sprite Kit: анимацию, излучатели, обнаружение столкновений и многое другое!


Учебное пособие по самолетам будет разделено на три части, чтобы полностью охватить каждый раздел. После прочтения учебника, состоящего из трех частей, читатели смогут создать интересную 2D-игру, используя новую среду Sprite Kit, поставляемую с iOS 7.

Каждая часть даст практический результат, а сумма всех частей — финальную игру. В то время как каждая часть серии может быть прочитана независимо, мы рекомендуем следовать шаг за шагом для полного понимания представленной темы. Исходный код для игры предоставляется постепенно с каждым постом.


Рисунок 1 Окончательный результат

Иллюстрация окончательного результата — Sprite Kit.

Добро пожаловать в третью часть нашей игры про самолеты со Sprite Kit. В нашем последнем посте мы сосредоточились на добавлении врагов и излучателей в игру. В сегодняшнем уроке вы запрограммируете обнаружение столкновений, работаете с атласом текстур и создаете несколько взрывов, чтобы закончить игру. Давайте начнем!


Тесты пересечений часто используются в средах, где существует более одного объекта. В Sprite Kit вы будете использовать Столкновения и Контакты, чтобы обнаружить попадание данного объекта в другой объект.

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

Для этого вам нужно определить значения маски категории. Для каждого физического объекта должна быть одна категория. В MyScene.h добавьте следующий код:

1
2
static const uint8_t bulletCategory = 1;
static const uint8_t enemyCategory = 2;

Теперь, пока все еще в MyScene.h, добавьте SKPhysicsContactDelegate как мы делали раньше с UIAccelerometerDelegate .

1
2
@interface MyScene : SKScene<UIAccelerometerDelegate, SKPhysicsContactDelegate>
{

Прежде чем вы сможете использовать физику, вам нужно инициировать настройки физики. В условном условии if (self = [super initWithSize:size]) создайте экземпляр силы тяжести со значением 0 (то есть без гравитации), а затем делегатом контакта:

1
2
self.physicsWorld.gravity = CGVectorMake(0, 0);
self.physicsWorld.contactDelegate = self;

Два тела, которые нуждаются в физике — пуля и враги. Давайте установим несколько свойств для каждого. Давайте добавим следующий код в метод -(void)EnemiesAndClouds :

1
2
3
4
5
enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemy.size];
enemy.physicsBody.dynamic = YES;
enemy.physicsBody.categoryBitMask = enemyCategory;
enemy.physicsBody.contactTestBitMask = bulletCategory;
enemy.physicsBody.collisionBitMask = 0;

Код выше заявляет, что область контакта самолета будет прямоугольником, который имеет размер вражеского спрайта. Динамическое свойство указывает, перемещается ли физическое тело с помощью физического моделирования. Далее, categoryBitMask — это место, где вы устанавливаете категорию для объекта, а contactTestBitMask указывает, с какими телами будут взаимодействовать враги (в данном случае с пулями).

Теперь давайте определим физику объекта пули. В пределах -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event , код -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event должен быть изменен так, чтобы добавить:

1
2
3
4
5
bullet.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bullet.size];
bullet.physicsBody.dynamic = NO;
bullet.physicsBody.categoryBitMask = bulletCategory;
bullet.physicsBody.contactTestBitMask = enemyCategory;
bullet.physicsBody.collisionBitMask = 0;

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

Вам нужно использовать метод didBeginContact чтобы узнать, какие объекты имеют контакт с другими объектами. Итак, следующий код вычисляет два тела, с которыми контактировал, и одновременно удаляет их со сцены:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-(void)didBeginContact:(SKPhysicsContact *)contact{
     
    SKPhysicsBody *firstBody;
    SKPhysicsBody *secondBody;
     
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }
     
    if ((firstBody.categoryBitMask & bulletCategory) != 0)
    {
         
        SKNode *projectile = (contact.bodyA.categoryBitMask & bulletCategory) ?
        SKNode *enemy = (contact.bodyA.categoryBitMask & bulletCategory) ?
        [projectile runAction:[SKAction removeFromParent]];
        [enemy runAction:[SKAction removeFromParent]];
         
    }
     
}

Довольно просто, правда? Теперь строим и запускаем. Если все прошло правильно, то враг и пуля исчезнут при их столкновении.


Наша игра почти завершена, но требует некоторых действий и анимации. Следующие два шага добавят взрывы и некоторые фоновые анимации, сделанные из облаков.

До сих пор мы не использовали Texture Atlas. Набор Sprite включает в себя генератор текстурного атласа, который имеет несколько интересных функций. В Xcode 5 вы можете создать атлас текстуры с помощью следующих шагов:

  1. Поместите все спрайты в одну папку. Для нашего проекта вы можете найти все изображения в прилагаемой загрузке в папке «EXPLOSION».
  2. Измените расширение папки на * .atlas. В нашем случае переименуйте EXPLOSION в EXPLOSION.atlas.
  3. Перетащите папку в проект. Я добавил его в папку «Файлы поддержки» в навигаторе Xcode.
  4. Убедитесь, что опция «Включить генерацию текстурных альт» включена. Чтобы проверить это, перейдите в настройки сборки вашего проекта.

Вот и все. Еще раз, изображения для этой части доступны в папке ресурсов прилагаемой загрузки.

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

В MyScene.h добавьте:

В конце условия if (self = [super initWithSize:size]) добавьте следующий фрагмент кода:

1
2
3
4
5
6
7
8
//load explosions
       SKTextureAtlas *explosionAtlas = [SKTextureAtlas atlasNamed:@»EXPLOSION»];
       NSArray *textureNames = [explosionAtlas textureNames];
       _explosionTextures = [NSMutableArray new];
       for (NSString *name in textureNames) {
           SKTexture *texture = [explosionAtlas textureNamed:name];
           [_explosionTextures addObject:texture];
       }

Как только вы загрузите взрывы, потребуется еще один шаг, чтобы увидеть их в действии. Теперь вы создадите взрыв, который происходит, когда пуля попадает в противника. В конце условного условия if ((firstBody.categoryBitMask & bulletCategory) != 0) добавьте следующий фрагмент if ((firstBody.categoryBitMask & bulletCategory) != 0) :

01
02
03
04
05
06
07
08
09
10
11
//add explosion
       SKSpriteNode *explosion = [SKSpriteNode spriteNodeWithTexture:[_explosionTextures objectAtIndex:0]];
       explosion.zPosition = 1;
       explosion.scale = 0.6;
       explosion.position = contact.bodyA.node.position;
        
       [self addChild:explosion];
        
       SKAction *explosionAction = [SKAction animateWithTextures:_explosionTextures timePerFrame:0.07];
       SKAction *remove = [SKAction removeFromParent];
       [explosion runAction:[SKAction sequence:@[explosionAction,remove]]];

Создайте и запустите проект, чтобы проверить анимацию столкновения и взрыва. Вы должны увидеть что-то вроде следующего рисунка:

Рисунок 1 Взрыв

Иллюстрация взрыва (Xcode).

Мы почти завершили игру! Это только последний штрих. Теперь вам нужно создать атлас облаков, а затем загрузить атлас текстуры в память.

Прежде чем писать код для этого шага, обязательно добавьте расширение .atlas в папку «Clouds» в прилагаемой загрузке и перетащите его в свой проект.

В файле MyScene.h добавьте следующее:

1
@property NSMutableArray *cloudsTextures;

В файле MyScene.m , под кодом «загрузить взрывы», добавьте следующее:

1
2
3
4
5
6
7
8
//load clouds
       SKTextureAtlas *cloudsAtlas = [SKTextureAtlas atlasNamed:@»Clouds»];
       NSArray *textureNamesClouds = [cloudsAtlas textureNames];
       _cloudsTextures = [NSMutableArray new];
       for (NSString *name in textureNamesClouds) {
           SKTexture *texture = [cloudsAtlas textureNamed:name];
           [_cloudsTextures addObject:texture];
       }

Последний шаг — случайное создание облаков и представление их на экране с некоторым движением. Вам нужно добавить следующий фрагмент в конце метода EnemiesAndClouds :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
//random Clouds
   int randomClouds = [self getRandomNumberBetween:0 to:1];
   if(randomClouds == 1){
        
       int whichCloud = [self getRandomNumberBetween:0 to:3];
       SKSpriteNode *cloud = [SKSpriteNode spriteNodeWithTexture:[_cloudsTextures objectAtIndex:whichCloud]];
       int randomYAxix = [self getRandomNumberBetween:0 to:screenRect.size.height];
       cloud.position = CGPointMake(screenRect.size.height+cloud.size.height/2, randomYAxix);
       cloud.zPosition = 1;
       int randomTimeCloud = [self getRandomNumberBetween:9 to:19];
        
       SKAction *move =[SKAction moveTo:CGPointMake(0-cloud.size.height, randomYAxix) duration:randomTimeCloud];
       SKAction *remove = [SKAction removeFromParent];
       [cloud runAction:[SKAction sequence:@[move,remove]]];
       [self addChild:cloud];
   }

Создайте и запустите проект еще раз. Если все идет хорошо, вы должны увидеть что-то вроде следующего рисунка:

Рисунок 2 Финал

Иллюстрация финальной игры (Xcode).

На этом завершается третий и последний урок, демонстрирующий, как создать игру для самолетов с использованием новой среды Sprite Kit, доступной в iOS 7 SDK. Если вы следили за этой серией от начала до конца, у вас теперь должно быть достаточно знаний для создания простой игры Sprite Kit с использованием этого динамичного нового игрового движка. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, оставляйте их ниже!


Мы хотели бы поблагодарить Дэниела Ференчака за то, что он предоставил нам игровое искусство, использованное для создания этой серии уроков.

Чтобы в полной мере оценить серию руководств, мы рекомендуем вам протестировать наш код, развернув его на реальном устройстве под управлением iOS 7. Вам потребуется Xcode 5 и последний iOS 7 SDK. Если у вас еще нет этих инструментов, вы можете загрузить их из центра разработчиков Apple . После загрузки установите программное обеспечение, и вы будете готовы начать.