Из этого туториала вы узнаете, как использовать среду Sprite Kit для создания простой игры «Самолеты». По пути вы узнаете все основные концепции Sprite Kit: анимацию, излучатели, обнаружение столкновений и многое другое!
Формат серии
Учебное пособие по самолетам будет разделено на три части, чтобы полностью охватить каждый раздел. После прочтения учебника, состоящего из трех частей, читатели смогут создать интересную 2D-игру, используя новую среду Sprite Kit, поставляемую с iOS 7.
- Создание игры на самолете с использованием набора Sprite — Настройка проекта
- Создайте игру на самолете с набором спрайтов — враги и эмиттеры
- Создайте игру на самолете с набором спрайтов — взрывы и облака
Каждая часть даст практический результат, а сумма всех частей — финальную игру. В то время как каждая часть серии может быть прочитана независимо, мы рекомендуем следовать шаг за шагом для полного понимания представленной темы. Исходный код для игры предоставляется постепенно с каждым постом.
Финальный просмотр
Где мы остановились …
Добро пожаловать в третью часть нашей игры про самолеты со Sprite Kit. В нашем последнем посте мы сосредоточились на добавлении врагов и излучателей в игру. В сегодняшнем уроке вы запрограммируете обнаружение столкновений, работаете с атласом текстур и создаете несколько взрывов, чтобы закончить игру. Давайте начнем!
1. Добавление обнаружения столкновений
Тесты пересечений часто используются в средах, где существует более одного объекта. В 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]];
}
}
|
Довольно просто, правда? Теперь строим и запускаем. Если все прошло правильно, то враг и пуля исчезнут при их столкновении.
2. Включение Атласа Текстур
Наша игра почти завершена, но требует некоторых действий и анимации. Следующие два шага добавят взрывы и некоторые фоновые анимации, сделанные из облаков.
До сих пор мы не использовали Texture Atlas. Набор Sprite включает в себя генератор текстурного атласа, который имеет несколько интересных функций. В Xcode 5 вы можете создать атлас текстуры с помощью следующих шагов:
- Поместите все спрайты в одну папку. Для нашего проекта вы можете найти все изображения в прилагаемой загрузке в папке «EXPLOSION».
- Измените расширение папки на * .atlas. В нашем случае переименуйте EXPLOSION в EXPLOSION.atlas.
- Перетащите папку в проект. Я добавил его в папку «Файлы поддержки» в навигаторе Xcode.
- Убедитесь, что опция «Включить генерацию текстурных альт» включена. Чтобы проверить это, перейдите в настройки сборки вашего проекта.
Вот и все. Еще раз, изображения для этой части доступны в папке ресурсов прилагаемой загрузки.
Теперь вам нужно загрузить текстурный атлас в проект.
В MyScene.h
добавьте:
@property NSMutableArray *jectionTextures;
В конце условия 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];
}
|
3. Добавление взрывов
Как только вы загрузите взрывы, потребуется еще один шаг, чтобы увидеть их в действии. Теперь вы создадите взрыв, который происходит, когда пуля попадает в противника. В конце условного условия 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]]];
|
Создайте и запустите проект, чтобы проверить анимацию столкновения и взрыва. Вы должны увидеть что-то вроде следующего рисунка:
4. Добавление облаков
Мы почти завершили игру! Это только последний штрих. Теперь вам нужно создать атлас облаков, а затем загрузить атлас текстуры в память.
Прежде чем писать код для этого шага, обязательно добавьте расширение .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];
}
|
Создайте и запустите проект еще раз. Если все идет хорошо, вы должны увидеть что-то вроде следующего рисунка:
Вывод
На этом завершается третий и последний урок, демонстрирующий, как создать игру для самолетов с использованием новой среды Sprite Kit, доступной в iOS 7 SDK. Если вы следили за этой серией от начала до конца, у вас теперь должно быть достаточно знаний для создания простой игры Sprite Kit с использованием этого динамичного нового игрового движка. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, оставляйте их ниже!
Благодарности и рекомендации
Мы хотели бы поблагодарить Дэниела Ференчака за то, что он предоставил нам игровое искусство, использованное для создания этой серии уроков.
Чтобы в полной мере оценить серию руководств, мы рекомендуем вам протестировать наш код, развернув его на реальном устройстве под управлением iOS 7. Вам потребуется Xcode 5 и последний iOS 7 SDK. Если у вас еще нет этих инструментов, вы можете загрузить их из центра разработчиков Apple . После загрузки установите программное обеспечение, и вы будете готовы начать.