Create Space Invaders med Swift og Sprite Kit: Gjennomføringsklasser
49
Del
7
Share < .no> Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Lag Space Invaders med Swift og Sprite Kit.Create Space Invaders med Swift og Sprite Kit. Presenterer Sprite KitCreate Space Invaders med Swift og Sprite Kit: Implementering GameplayWhat Du ll være å skape
I første del av denne serien, vi utforsket det grunnleggende settet rammeverket Sprite og implementert spillets startskjermen. I denne opplæringen vil vi implementere spillets hovedklassene.
Swift er et objektorientert språk, og vi vil dra nytte av dette ved å skille alle spillets enheter i egne klasser. Vi vil begynne med å implementere Invader klassen.
1. Implementering av Invader Klasse
Trinn 1: Lag Invader Class
Velg Ny > Fil ... fra Xcode Fil-menyen velger Cocoa Touch Class fra iOS > § kilde, og klikk på Neste. Navn klassen Invader og sørg for at den arver fra SKSpriteNode. Kontroller at språket er satt til Swift. Skriv inn følgende kode i Invader.swift
importere UIKitimport SpriteKitclass Invader. SKSpriteNode {var invaderRow = 0 Var invaderColumn = 0 init () {la tekstur = SKTexture (imageNamed: "invader1") super.init (tekstur: tekstur, farge: SKColor.clearColor (), størrelse: texture.size ()) self.name = "invader"} nødvendig init (koder aDecoder:? NSCoder) {super.init (koder: aDecoder)} func fireBullet (scene: SKScene) {}}
The Invader klasse er en underklasse av den SKSpriteNode klassen. Den har to eiendommer, invaderRow og invaderColumn. Inntrengerne er innrettet i et rutenett, akkurat som i den opprinnelige Space Invaders spillet. De to eiendommene gi oss en enkel måte å holde styr på hvilken rad og kolonne inntrengeren er i.
I init-metoden, initial vi en SKTexture eksempel. Init (imageNamed :) metoden tar et bilde som en parameter. Vi deretter påberope initializer av superklasse, passerer i tekstur, SKColor.clearColor for fargen parameter, og for størrelsen parameter vi passere i teksturen størrelse. Til slutt, vi setter navnet til "invader" så vi kan identifisere den senere.
init-metoden er en utpekt initializer, noe som betyr at vi trenger å delegere initialisering opp til et utpekt initializer av Invader er super. Det er derfor vi påkalle init (tekstur: farge:. Størrelse :) metode
Du kan lure på hvorfor det er nødvendig init (koder :) metoden er der også. Den SKSpriteNode samsvarer med NSCoding protokollen. Init (koder :) metoden er merket som nødvendig, noe som betyr at hver underklasse trenger å overstyre denne metoden
Vi vil implementere fireBullet metoden senere i denne opplæringen
Trinn 2:.. Legg Invaders til Scene
I dette trinnet, vil vi legge til inntrengerne til GameScene. Åpne GameScene.swift og slette alt inne i didMoveToView (_ :) metode samt alt innenfor touchesBegan (_: withEvent :) metode. Innholdet i GameScene.swift skal nå se slik ut
importere SpriteKitclass GameScene: SKScene {ride func didMoveToView (vis: SKView) {} overstyring func touchesBegan. (Berører: Set < NSObject >, withEvent hendelse: UIEvent) {/* kalles når en touch begynner * /} overstyring func oppdateringen (currentTime: CFTimeInterval) {/* kalt før hver ramme gjengis * /}}
Vi vil ha en global variabel i vårt prosjekt, invaderNum. Denne variabelen brukes til å holde oversikt over dagens nivå på spillet. Ved å erklære det som en global variabel, har vi tilgang til invaderNum over scener. Å deklarere variabelen som en global variabel, erklærer vi den utenfor GameScene klassen
importere SpriteKitvar invaderNum = 1class GameScene:.. SKScene {...
Deretter legger følgende egenskaper til GameScene klassen
klasse GameScene: SKScene {la rowsOfInvaders = 4 Var invaderSpeed = 2 Let leftBounds = CGFloat (30) Var rightBounds = CGFloat (0) Var invadersWhoCanFire: [Invader] = [] overstyring func didMoveToView (vis: SKView) {}
Den rowsOfInvaders Eiendommen er hvor mange rader av inntrengere spillet vil ha og invaderSpeed eiendommen er hvor fort inntrengerne vil flytte. De leftBounds og rightBounds egenskapene brukes til å opprette en margin på venstre og høyre side av skjermen, begrense inntrengerne bevegelsen i venstre og høyre retning. Og til slutt, er det invadersWhoCanFire eiendommen en matrise som brukes til å holde oversikt over hvilke inntrengere kan fyre av en kule.
Legg til setupInvaders metoden under oppdateringen (currentTime :) metoden i GameScene klassen.
funk setupInvaders () {var invaderRow = 0; Var invaderColumn = 0; la numberOfInvaders = invaderNum * 2 + 1 for var i = 1; i < = rowsOfInvaders; i ++ {invaderRow = i for Var j = 1; j < = numberOfInvaders; j ++ {invaderColumn = j la tempInvader: Invader = Invader () la invaderHalfWidth: CGFloat = tempInvader.size.width /2 la xPositionStart: CGFloat = size.width /2 - invaderHalfWidth - (CGFloat (invaderNum) * tempInvader.size.width) + CGFloat (10) tempInvader.position = CGPoint (x: xPositionStart + ((tempInvader.size.width + CGFloat (10)) * (CGFloat (j-1))), y: CGFloat (self.size.height - CGFloat (i) * 46)) tempInvader.invaderRow = invaderRow tempInvader.invaderColumn = invaderColumn addChild (tempInvader) hvis (i == rowsOfInvaders) {invadersWhoCanFire.append (tempInvader)}}}}
Vi har de invaderRow og invaderColumn variabler som vil bli brukt til å sette egenskapene til samme navn på inntrengeren. Deretter bruker vi en dobbel for løkke til å legge ut inntrengerne på skjermen. Det er mye av numerisk type konvertering skjer, fordi swift ikke implisitt konvertere tall til riktig type. Vi må gjøre det selv.
Vi først bruke et nytt Invader, tempInvader, og deretter erklære en konstant invaderHalfWidth som er halve størrelsen av tempInvader.
Deretter beregner vi xPositionStart slik at inntrengere alltid vil være innrettet i midten av scenen. Vi får halvparten av scenens bredde og trekke fra halvparten av inntrenger bredde ettersom standardregistreringspunktet er sentrum (0,5, 0,5) av sprite. Vi må da trekke fra bredden av inntrenger ganger men mye invaderNum er lik, og legge 10 til denne verdien, siden det er 10 poeng av plass mellom inntrengerne. Dette kan være litt vanskelig å forstå i starten, så ta deg tid til å forstå det.
Vi satt inntrengeren posisjon eiendom, som er en GGPoint. Vi bruker litt mer matematikk for å sørge for at hver inntrenger har 10 poeng av plass mellom dem og at hver rad har 46 poeng av plass mellom dem.
Vi tildele invaderRow og invaderColumn egenskaper, og tilsett tempInvader til scene med addChild (_ :) metoden. Hvis dette er den siste raden av inntrengerne, setter vi tempInvader inn i invadersWhoCanFire array.
setupInvaders metoden er påberopt i didMoveToView (_ :) metoden. I denne metoden, vi også stille inn bakgrunnsfarge eiendom til SKColor.blackColor
overstyring func didMoveToView (vis: SKView). {Bakgrunnsfarge = SKColor.blackColor () setupInvaders ()}
Hvis du tester programmet, du bør se 4 rader med 3 inntrengere. Hvis du setter invaderNum til 2 , etter du bør se 4 rader med 5 inntrengerne innrettet i midten av scenen.
2. Implementering spilleren Class
Trinn 1: Lag Player Class
Opprett en ny Cocoa Touch Class heter Player som er en underklasse av SKSpriteNode. Legg til følgende implementering Player.swift
import UIKitimport SpriteKitclass Player. SKSpriteNode {init () {la tekstur = SKTexture (imageNamed: "PLAYER1") super.init (tekstur: tekstur, farge: SKColor.clearColor (), størrelse: texture.size ()) animere ()} kreves init (koder aDecoder:? NSCoder) {super.init (koder: aDecoder)} private func animere () {var playerTextures: [SKTexture] = [] for jeg i en ... 2 {playerTextures.append (SKTexture (imageNamed: "player \\ (i)"))} la playerAnimation = SKAction.repeatActionForever (SKAction.animateWithTextures (playerTextures, timePerFrame: 0,1)) self.runAction (playerAnimation) } func die () {} func kill () {} func respawn () {} func fireBullet (scene: SKScene) {}}
init-metoden bør se kjent. Den eneste forskjellen er at vi bruker et annet bilde for det første oppsettet. Det er to bilder navngitte PLAYER1 og Player2 i Bilder-mappen, har man thruster engasjert og den andre har thrusteren av. Vi vil hele tiden veksle mellom disse to bildene, og skaper en illusjon av en thruster tenning på og av. Dette er hva animere metoden gjør.
I animere metoden, har vi en rekke playerTextures som skal inneholde teksturer for animasjonen. Vi legger til SKTexture objektene til denne matrisen ved hjelp av en for-i loop og et lukket område ved hjelp lukket utvalg operatør. Vi bruker string interpolering for å få riktig bilde og initial en SKTexture eksempel.
Vi erklærer en konstant, playerAnimation, som påkaller repeatActionForever metoden i SKAction klassen. I den handlingen, påberope vi animateWithTextures (_: timePerFrame :). De animateWithTextures (_: timePerFrame :) metoden tar som parameter en rekke teksturer og hvor mye tid som hver tekstur vises. Til slutt, påberope vi runAction (_ :) og passere i playerAnimation
De andre metoder vil bli gjennomført senere i denne opplæringen
Trinn 2:.. Legge spilleren til Scene
Erklærer en konstant eiendom heter spilleren til GameScene klassen
klasse GameScene. SKScene {... Var invadersWhoCanFire: [Invader] = [Invader] () la spiller: Spiller = Player ( )
Deretter legger setupPlayer metoden under setupInvaders metoden
func setupPlayer () {player.position = CGPoint (x: CGRectGetMidX (self.frame)., y: player.size.height /2 + 10) addChild (spiller)}
Du bør være kjent med gjennomføringen av setupPlayer metoden. Vi setter spillerens posisjon og legge den til scenen. Men bruker vi en ny funksjon, CGRectGetMidX (_ :), som returnerer sentrum av et rektangel langs x-aksen. Her bruker vi scenens ramme
Du kan nå påberope seg setupPlayer metoden i didMoveToView (_ :) metode
styre func didMoveToView (vis:.. SKView) {bakgrunnsfarge = SKColor.blackColor ( ) setupInvaders () setupPlayer ()}
Hvis du tester programmet, skal du se spilleren lagt til bunnen av skjermen med thrustere engasjert og avfyring.
3. Implementere Bullet Classes
Trinn 1: Lag Bullet klassen
Opprett en ny Cocoa Touch Class heter Bullet som er en underklasse av den SKSpriteNode klassen
importere UIKitimport SpriteKitclass Bullet. SKSpriteNode { init (imageName: String, bulletSound: String) {la tekstur = SKTexture (imageNamed: imageName) super.init (tekstur: tekstur, farge: SKColor.clearColor (), størrelse: texture.size ()) if (bulletSound =! null) {runAction (SKAction.playSoundFileNamed (bulletSound !, waitForCompletion: false))}} kreves init (koder aDecoder:? NSCoder) {super.init (koder: aDecoder)}}
init metoden tar to parametre, imageName og bulletSound. Den andre parameteren er valgfri. Spilleren vil spille en laser høres hver gang en kule er avfyrt. Jeg har ikke inntrengerne gjør at i dette spillet, selv om du sikkert kunne. Det er også grunnen til at kulen lyden er en valgfri parameter. Du kan også bruke en annen lyd for hver enkelt.
Den første delen bør være kjent, selv om vi nå skaper tekstur med det bildet ble vedtatt i som første argument. Dette vil tillate deg å bruke forskjellige bilder for spilleren og inntrengere 'kuler hvis du ønsket å
Hvis bulletSound er ikke null, kjører vi en SKAction metode playSoundFileNamed (_:. WaitForCompletion :). Denne metoden tar som parametere a String, som er navnet på lydfilen inkludert utvidelsen, og en Bool, waitForCompletion. Den waitForCompletion parameter er ikke viktig for oss. Hvis det ble satt til å true, da handlingen skulle vare imidlertid lenge lydfilen er
Trinn 2:. Opprett InvaderBullet Class
Opprett en ny Cocoa Touch Class heter InvaderBullet som er en underklasse av Bullet klassen
import UIKitimport SpriteKitclass InvaderBullet. Bullet {overstyring init (imageName: String, bulletSound: String) {super.init (imageName: imageName, bulletSound: bulletSound)?} kreves init (koder aDecoder: NSCoder) {super.init (koder: aDecoder)}}
Gjennomføringen av InvaderBullet klassen kanskje ikke mye mening, fordi vi bare kaller init (imageName: bulletSound :) metode for superklassen i init ( imageName: bulletSound :) initializer. Det vil imidlertid gjøre mye mer fornuftig hvorfor det er satt opp på denne måten når vi legger til koden for dueller
Trinn 3:. Opprett PlayerBullet Class
Opprett en ny Cocoa Touch Class oppkalt PlayerBullet som også er en underklasse av Bullet klassen. Som du kan se, er gjennomføringen av PlayerBullet klassen identisk med den InvaderBullet klassen
importere UIKitimport SpriteKitclass PlayerBullet. Bullet {overstyring init (imageName: String, bulletSound: String) {super.init (imageName: imageName , bulletSound: bulletSound)} kreves init (koder aDecoder:? NSCoder) {super.init (koder: aDecoder)}}
Konklusjon
I denne opplæringen, vi laget og implementert noen av de viktigste klasser av spillet. Vi har lagt et rutenett av inntrengerne til åstedet og romskipet spilleren vil være kontrollerende. Vi vil fortsette å jobbe med disse klassene i neste del av denne serien der vi gjennomføre gameplay.