Acest tutorial vă va învăța cum să utilizați cadrul Sprite Kit pentru a crea un joc simplu de avioane. Pe parcurs, veți afla toate conceptele de bază ale Sprite Kit: animații, emițătoare, detectarea coliziunilor și multe altele!
Tutorialul avioanelor va fi împărțit în trei părți pentru a acoperi complet fiecare secțiune. După ce ați citit tutorialul cu trei părți, cititorii vor putea să creeze un joc interesant 2D utilizând noul cadru Sprite Kit furnizat cu iOS 7.
Fiecare parte va produce un rezultat practic, iar suma tuturor pieselor va produce jocul final. În timp ce fiecare parte a seriei poate fi citită independent, vă recomandăm să urmăriți pas cu pas o înțelegere completă a subiectului prezentat. Codul sursă pentru joc este furnizat incremental cu fiecare postare.
Bine ați venit în cea de-a treia parte a jocului nostru de avioane cu Sprite Kit. În ultimul nostru post, ne-am concentrat pe adăugarea de dușmani și emițători la joc. În tutorialul de astăzi, veți programa detectarea coliziunilor, veți lucra cu un atlas de textură și veți crea câteva explozii pentru a termina jocul. Să începem!
Testele de intersecție sunt frecvent utilizate în medii în care există mai multe obiecte. În Sprite Kit, veți folosi coliziunile și contactele pentru a detecta dacă un obiect dat a lovit un alt obiect.
În acest joc, veți utiliza detectarea coliziunilor. Când un glonț intră în contact cu un dușman, atât glonțul cât și inamicul vor fi eliminate de pe ecran.
Pentru a face acest lucru, trebuie să definiți valorile măștii categoriei. Ar trebui să existe o categorie pentru fiecare obiect fizic. În MyScene.h
, adăugați următorul cod:
statică const uint8_t bulletCategory = 1; static const uint8_t enemyCategory = 2;
Acum, încă în interiorul MyScene.h, adăugați SKPhysicsContactDelegate
așa cum am făcut înainte cu UIAccelerometerDelegate
.
@ interfață MyScene: SKScene
Înainte de a putea folosi fizica, trebuie să inițiați setările fizicii. La dacă (auto = [super initWithSize: dimensiune])
condițional, instanțiați gravitatea cu o valoare 0 (adică fără gravitate) și apoi cu delegatul de contact:
self.physicsWorld.gravity = CGVectorMake (0, 0); auto.physicsWorld.contactDelegate = auto;
Cele două corpuri care au nevoie de fizică sunt glonțul și dușmanii. Să stabilim câteva proprietăți pentru fiecare. Să adăugăm codul de mai jos în cadrul -(void) EnemiesAndClouds
metodă:
enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: enemy.size]; enemy.physicsBody.dynamic = DA; enemy.physicsBody.categoryBitMask = enemyCategory; enemy.physicsBody.contactTestBitMask = bulletCategory; enemy.physicsBody.collisionBitMask = 0;
Codul de mai sus prevede că zona de contact a avionului va fi un dreptunghi care are dimensiunea sprite-ului inamic. Proprietatea dinamică indică dacă corpul fizicii este mișcat de simularea fizică. Apoi, categoryBitMask
este locul unde ați setat categoria la obiect și contactTestBitMask
se referă la corpurile pe care dușmanii vor interacționa (în acest caz cu gloanțe).
Acum, să definim fizica pentru obiectul glonțului. În cadrul -(void) touchesBegan: (NSSet *) atinge evenimentul Event: (UIEvent *)
, codul bullet trebuie modificat pentru a adăuga:
bullet.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: bullet.size]; bullet.physicsBody.dynamic = NO; bullet.physicsBody.categoryBitMask = bulletCategory; bullet.physicsBody.contactTestBitMask = inamicCategorie; bullet.physicsBody.collisionBitMask = 0;
Până acum, ați definit proprietățile pentru coliziuni. Cu toate acestea, trebuie să detectăm dacă este făcut un contact.
Trebuie să utilizați metoda didBeginContact
să știm ce obiecte au contactul cu alte obiecte. Deci, următorul cod calculează cele două corpuri care au contactat și le elimină simultan din scenă:
-(void) didBeginContact: (SKPhysicsContact *) contactați SKPhysicsBody * firstBody; SKPhysicsBody * secondBody; dacă (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) ? contact.bodyA.node : contact.bodyB.node; SKNode *enemy = (contact.bodyA.categoryBitMask & bulletCategory) ? contact.bodyB.node : contact.bodyA.node; [projectile runAction:[SKAction removeFromParent]]; [enemy runAction:[SKAction removeFromParent]];
Destul de simplu, nu? Acum, construiți și fugiți. Dacă totul merge bine, atunci dușmanul și glonțul vor dispărea atunci când se ciocnesc.
Jocul nostru este aproape complet, dar are nevoie de unele acțiuni și de animație. Următorii doi pași vor adăuga explozii și câteva animații de fundal realizate din nori.
Până acum, nu am folosit Atlasul texturii. Sprite Kit include un generator de texturi atlas care are câteva caracteristici interesante. În Xcode 5, puteți crea un atlas de textura cu următorii pași:
Asta e. Încă o dată, imaginile pentru această parte sunt disponibile în dosarul Resurse al descărcării atașate.
Acum, trebuie să încărcați atlasul texturii în proiect.
În MyScene.h
adăuga:
@property NSMutableArray * explosionTextures;
La sfârșitul dacă (auto = [super initWithSize: dimensiune])
condiționată, adăugați următorul fragment de cod:
// explozii de încărcare SKTextureAtlas * explosionAtlas = [SKTextureAtlas atlasNamed: @ "EXPLOSION"]; NSArray * textureNames = [explozieAtlas textureNames]; _explosionTextures = [NSMutableArray new]; pentru (NSString * numele în textureNames) SKTexture * texture = [explosionAtlas textureNamed: name]; [explosionTexuri addObject: textură];
Odată ce ați încărcat explozii, este nevoie de un alt pas pentru a le vedea în acțiune. Acum veți crea o explozie care apare atunci când un glonț lovește un inamic. La sfârșitul condiției condiționate dacă ((firstBody.categoryBitMask & bulletCategory)! = 0)
, adăugați următorul fragment:
// adăugați explozie SKSpriteNode * explozie = [SKSpriteNode spriteNodeWithTexture: [_exploziaTexuri objectAtIndex: 0]]; exploion.zPoziție = 1; explosion.scale = 0,6; explozie. pozitie = contact.bodyA.node.position; [self addChild: explozie]; SKAction * explosionAction = [SKAction animateWithTextures: _explosionTextures timePerFrame: 0.07]; SKAction * remove = [SKAction removeFromParent]; [explozie runAction: [secvența SKAction: @ [explosionAction, remove]];
Construiți și conduceți proiectul pentru a testa animația de coliziune și explozie. Ar trebui să vedeți ceva asemănător figurii următoare:
Ilustrația Exploziei (Xcode).Aproape am terminat jocul! Aceasta este doar ultima atingere. Acum trebuie să creați atlasul nori și apoi încărcați atlasul texturii în memorie.
Înainte de a scrie codul pentru acest pas, asigurați-vă că adăugați extensia .atlas în dosarul "Clouds" din fișierul descărcat atașat și îl trageți în proiect.
În cadrul MyScene.h
fișier adăugați următoarele:
@property NSMutableArray * cloudsTextures;
În cadrul MyScene.m
dosar, sub codul "explozii de sarcină", adăugați următoarele:
// nori de încărcare SKTextureAtlas * cloudsAtlas = [SKTextureAtlas atlasNamed: @ "Clouds"]; NSArray * textureNamesClouds = [noriAtlas textureNames]; _cloudsTextures = [NSMutableArray nou]; pentru (NSString * nume în textureNamesClouds) SKTexture * texture = [noriAtlas textureNamed: name]; [_cloudsTexuri addObject: textura];
Ultimul pas este de a genera întâmplător norii și a le prezenta pe ecran cu mișcare. Trebuie să adăugați următorul fragment la sfârșitul secțiunii EnemiesAndClouds
metodă:
// aleatoare nori int randomClouds = [auto getRandomNumber între: 0 la: 1]; dacă (randomClouds == 1) int careCloud = [auto getRandomNumber între: 0 la: 3]; SKSpriteNode * cloud = [SKSpriteNode spriteNodeWithTexture: [_cloudsTextures objectAtIndex: whichCloud]]; int randomYAxix = [auto getRandomNumber între: 0 până la: screenRect.size.height]; cloud.position = CGPointMake (screenRect.size.height + cloud.size.height / 2, randomYAxix); cloud.zPosition = 1; int randomTimeCloud = [auto getRandomNumber între: 9 până la: 19]; SKAction * move = [deplasare SKAction: CGPointMake (0-cloud.size.height, randomYAxix) durata: randomTimeCloud]; SKAction * remove = [SKAction removeFromParent]; [nod de rulareAcțiune: [secvența SKAction: @ [move, remove]]; [auto addChild: nor];
Construiți și conduceți proiectul încă o dată. Dacă totul merge bine, ar trebui să vedeți ceva asemănător cu figura următoare:
Ilustrația jocului final (Xcode).Acest lucru încheie cel de-al treilea și ultimul tutorial care demonstrează cum se creează un joc de avioane utilizând noul cadru Sprite Kit disponibil cu iOS 7 SDK. Dacă ați urmat această serie de la start-to-finish, acum ar trebui să aveți suficiente cunoștințe pentru a crea un simplu joc Sprite Kit utilizând acest motor dinamic nou. Dacă aveți întrebări sau comentarii, vă rugăm să le lăsați mai jos!
Am dori să-i mulțumim lui Daniel Ferenčak pentru că ne-a oferit arta jocului folosită pentru a produce această serie de tutori.
Pentru a aprecia pe deplin seria tutorial, vă sfătuim să vă testați codul, implementându-l pe un dispozitiv real care rulează iOS 7. Veți avea nevoie de Xcode 5 și de cel mai recent SDK pentru iOS 7. Dacă nu aveți deja aceste instrumente, le puteți descărca de la Centrul pentru dezvoltatori Apple. Odată descărcat, instalați software-ul și veți fi gata să începeți.