În acest tutorial, cea de-a patra tranșă a seriei SpriteKit From Scratch, ne uităm la diferitele caracteristici vizuale și audio pe care SpriteKit le oferă pentru a adăuga mai multe detalii și varietăți jocurilor dvs. Acestea includ sistemele de particule, filtrele, iluminatul și sunetul.
Pentru a urmări împreună cu mine, puteți utiliza proiectul pe care l-ați creat în tutorialul anterior al acestei serii sau puteți descărca o copie nouă de la GitHub.
Grafica folosită pentru joc în această serie poate fi găsită pe GraphicRiver. GraphicRiver este o sursă excelentă pentru găsirea de ilustrații și grafică pentru jocurile dvs..
În SpriteKit, termenul de sistem de particulese referă la un singur nod emițător, reprezentat de SKEmitterNode
clasă. Acesta definește poziția sistemului în scena dvs. și toate particulele pe care le creează. Emițătorul specifică diferitele comportamente ale particulelor pe care le generează.
Sistemele de particule sunt cel mai bine folosite în jocurile SpriteKit în care trebuie să generați un număr mare de sprite identice sau similare, care nu trebuie să aibă o anumită locație sau să execute acțiuni.
În acest tutorial, vom adăuga două sisteme de particule atunci când mașina atinge un obstacol:
În timp ce sistemele de particule pot fi create în mod programabil, este mult mai ușor să le folosiți utilizând editorul construit în Xcode. Toate proprietățile unui sistem de particule pot fi modificate în acest editor și modificările pe care le faceți sunt imediat vizualizate. Acest lucru este mult mai ușor decât să trebuiască să-ți conduci jocul după fiecare schimbare pe care o faci.
Vom crea primul efect de explozie. Creați un fișier nou în proiectul dvs. și alegeți iOS> Resurse> Fișier SpriteKit Particle șablon.
Din meniul care apare, selectați Foc dupa cum Șablon de particule. Denumiți fișierul Explozie sau ceva similar.
După ce Xcode a creat fișierul, veți vedea că există două fișiere noi în proiect, Explosion.sks și spark.png.
Explosion.sks conține sistemul de particule și este dosarul cu care vom lucra. Al doilea fișier, spark.png, este o imagine simplă folosită de Foc șablon de particule pentru a-și crea efectul vizual. Dacă vă deschideți Explosion.sks, puteți vedea focul animat.
Cele mai importante schimbări pe care trebuie să le facem în acest sistem de particule sunt ca particulele să se deplaseze în afara emițătorului în toate direcțiile și să nu creeze în mod continuu particule noi.
Pentru a face prima schimbare, deschideți Atribuții Inspector și, sub Particulele secțiune, schimbare Unghi de acțiune la 360 °.
Departe, puteți vedea că particulele se deplasează în exterior într-o formă circulară.
Pentru a opri sistemul de particule de a crea continuu particule noi, putem specifica a Maxim valoare. Această valoare indică sistemului de particule câte particule ar trebui să creeze total. Valoarea implicită a 0 înseamnă că nu există un maxim, ceea ce face ca noi particule să fie create în mod continuu.
Pe lângă specificarea unei valori maxime, vom schimba și câteva alte proprietăți pentru a crea un efect de explozie mai bun. În Particulele secțiunea din Atribuții Inspector, schimbați următoarele valori:
Noi am stabilit Rata de nastere la o valoare care este mai mare decât valoarea Maxim proprietate deoarece determină câte particule sunt create pe secunda. Vrem ca explozia să se întâmple foarte repede. Deci, mai degrabă decât de a avea 1.000 de particule de reproducere pe durata unei secunde pline, care s-ar întâmpla cu a Rata de nastere din 1.000, specificăm a Rata de nastere de 5.000. Aceasta înseamnă că toate particulele sunt create în doar 0,2 secunde.
Prin setare Durata de viață> Începeți la 3 particulele trăiesc timp de 3 secunde. Durata de viață proprietatea poate fi folosită pentru a adăuga variații la durata de viață a particulelor.
În cele din urmă, am stabilit Viteză> Pornire la 200 astfel încât particulele să zboare foarte repede din emițător, așa cum s-ar întâmpla într-o explozie reală.
După efectuarea acestor modificări, puteți vedea că sistemul de particule arată destul de diferit și mai mult ca o explozie adecvată.
Rețineți că, deși animația buclează periodic în editorul Xcode, sistemul de particule animă o singură dată când este adăugat la scenă.
Odată cu finalizarea sistemului de particule de explozie, este timpul să trecem la sistemul de particule de fum. Creați un fișier nou, Fum, folosind același șablon pe care l-am folosit pentru explozie. Singura diferență este Șablon de particule, la care am stabilit Fum.
Singura modificare pe care trebuie să o facem pentru acest sistem de particule este ca fumul să se miște spre exterior într-un cerc, mai degrabă decât drept. Pentru aceasta, schimbați Unghi> Interval proprietate la 360 ° cum am făcut pentru sistemul de particule de explozie. După aceasta, sistemul de particule de fum ar trebui să pară așa:
Cu ambele sisteme de particule gata, le putem adăuga la scena noastră. Pentru aceasta, încărcăm fiecare fișier pe care l-am creat SKEmitterNode
obiecte și apoi adăugați-le pe scena ca un nod obișnuit. Deschis MainScene.swift și să înlocuiască punerea în aplicare a didBeginContact (_ :)
cu urmatoarele:
func didBeginContact (contact: SKPhysicsContact) if contact.bodyA.node == player || contact.bodyB.node == player if a permite exploziePath = NSBundle.mainBundle () pathForResource ("Explosion", ofType: "sks"), permite smokePath = NSBundle.mainBundle () pathForResource ("Smoke" sks "), să explice explozia = NSKeyedUnarchiver.unarchiveObjectWithFile (explosionPath) ca? SKEmitterNode, permiteți smoke = NSKeyedUnarchiver.unarchiveObjectWithFile (smokePath) ca? SKEmitterNode player.removeAllActions () aparat de fotografiat? .RemoveAllActions () player.hidden = true player.removeFromParent () explozie.position = player.position smoke.position = pozitie jucator addChild (smoke) addChild (explosion)
Ca și în implementarea anterioară a didBeginContact (_ :)
, efectuăm același control ca înainte pentru a vedea dacă unul dintre nodurile implicate în coliziune este nodul mașinii. Apoi utilizăm legarea opțională pentru a obține căile spre fișierele de resurse ale sistemului de particule de explozie și ale fumului. Utilizăm aceste căi pentru a crea instanțe SKEmitterNode
obiecte de la ei.
Apoi, eliminăm toate acțiunile din nodurile camerei și ale playerului și ascundem nodul jucătorului, eliminându-l din scenă. Îndepărtăm mașina pentru a evita mai multe coliziuni, ceea ce duce apoi la mai multe explozii.
De asemenea, stabilim poziția nodurilor emițătorului la cea a mașinii și le adăugăm la scenă. Ca rezultat, SpriteKit începe imediat animarea sistemelor de particule de îndată ce acestea sunt adăugate la scenă.
Construiți și conduceți jocul. Ar trebui să vedeți sistemul de particule de explozie imediat ce mașina atinge un obstacol. Acest lucru este urmat de fum odată ce focul a fost șters.
În SpriteKit, există un tip special de nod (reprezentat de SKEffectNode
clasa), care poate folosi a Imagine de bază filtru obiect (reprezentat de CIFilter
clasa) pentru a-și face nodurile copilului cu o varietate de efecte. SKScene
clasa este, de asemenea, o subclasă de SKEffectNode
, ceea ce înseamnă că puteți aplica, de asemenea, un filtru pe întreaga scenă.
Din păcate, la scrierea acestui tutorial, există câteva probleme legate de aceste filtre și noduri de efecte în iOS 9. În momentul în care un efect este activat pentru un nod de efecte, toți copiii sunt ascunși, ceea ce are ca rezultat efectul fiind nevăzut.
Chiar dacă nu reușim să implementăm acest lucru în jocul nostru și să vedem cum arată, putem continua să executăm codul care ar fi folosit pentru a crea un efect. În acest caz, următoarea metodă este un exemplu de adăugare și de estompare treptată a efectului de estompare asupra întregii scene.
func adăugațiBlurFilter () permite blurFilter = CIFilter (nume: "CIGaussianBlur") blurFilter? .setDefaults () blurFilter? .setValue (0.0, pentruKey: "inputRadius") filter = blurFilter shouldEnableEffects = true runAction (SKAction.customActionWithDuration : (nod: SKNode, elapsedTime: CGFloat) înăuntru currentRadius = elapsedTime * 10.0 blurFilter? .setValue (currentRadius, pentruKey: "inputRadius"))
Creăm a CIFilter
obiect de un anumit tip. Dacă doriți să vă uitați la unele dintre celelalte filtre integrate disponibile, consultați Referința filtrelor de bază. Asigurăm că acest filtru are toate valorile implicite de intrare și apoi este setat manual inputRadius
la 0.0, ceea ce înseamnă că nu există inițial nici o estompare.
Apoi atribuim filtrul la filtru
proprietatea scenei actuale și setului shouldEnableEffects
la Adevărat
pentru a le permite. În cele din urmă, avem un obicei SKAction
care crește treptat raza de intrare a filtrului la 10.
Sperăm că, într-o versiune viitoare a versiunii iOS, problemele care afectează nodurile de efecte sunt fixe, deoarece oferă o modalitate de a adăuga câteva efecte foarte unice și interesante scenelor SpriteKit.
SpriteKit include, de asemenea, un sistem excelent de iluminare care poate fi folosit pentru a face scenele dvs. să se simtă mai realiste. Lumini sunt foarte ușor de implementat și sunt create prin utilizarea SKLightNode
clasă. Un nod ușor definește anumite proprietăți, cum ar fi culoarea luminii (inclusiv culoarea ambiantă) și rezistența la distanță.
În scenă, vom crea o singură lumină albă, care va fi atașată de mașină. Această lumină va lumina obstacolele din fața mașinii și va produce umbre.
Să începem prin a crea o lumină în didMoveToView (_ :)
metoda dvs. de MainScene
clasă.
suprascrie func didMoveToView (vizualizare: SKView) ... permite lumina = SKLightNode () light.lightColor = UIColor.whiteColor () light.falloff = 0.5 player.addChild (lumina)
Cu acest cod, creăm un nou SKLightNode
obiect, schimba-l culoare deschisa
proprietate la alb, și să-și coboare a cadea
proprietate de la valoarea implicită de 1 la 0.5.
La fel ca atunci când stabiliți detecția coliziunilor fizice în SpriteKit, trebuie să specificați ce lumini interacționează cu care noduri dintr-o scenă prin utilizarea măștilor de biți. Atunci când SpriteKit redă luminile într-o scenă, utilizează un operator AND logic pe nodul luminos categoryBitMask
si lightingBitMask
și shadowCastBitMask
din fiecare alt nod pentru a determina modul în care nodul respectiv ar trebui să apară.
Pentru jocul nostru, dorim obstacolele de a interacționa cu lumina, astfel încât acestea să arunce umbre în scenă. Pentru a face acest lucru, adăugați următoarele două linii la sfârșitul secțiunii spawnObstacle (_ :)
metodă a MainScene
clasă:
func spawnObstacle (temporizator: NSTimer) ... obstacle.lightingBitMask = 0xFFFFFFFF obstacle.shadowCastBitMask = 0xFFFFFFFF
Prin setarea unei măști bit cu toate biții activat, obstacolele interacționează cu fiecare lumină din scenă.
Construiți și executați aplicația. Veți vedea că, în timp ce mașina dvs. se deplasează prin scenă, fiecare obstacol are o umbră dinamică, care întotdeauna se îndreaptă spre centrul autovehiculului.
După cum puteți vedea, luminile din SpriteKit sunt foarte simple de utilizat și pot adăuga efecte drăguțe scenelor dvs..
În cele din urmă, vom examina nodurile audio în SpriteKit. Nodurile audio sunt folosite pentru a adăuga efecte sonore la o scenă. Aceste noduri speciale sunt reprezentate de SKAudioNode
clasă. pentru că SKAudioNode
este un SKNode
subclasa, le puteți adăuga și poziționa oriunde într-o scenă, ca un nod obișnuit.
În plus față de redarea audio în mod regulat și sunet la fel, indiferent de aranjamentul scenei dvs. (de exemplu muzica de fundal), SpriteKit vă permite să utilizați un sunet pozițional pentru a crea un efect cu adevărat imersiv. Aceasta se face prin specificarea a ascultător
nod pentru scena dvs., unde sunetul va fi "auzit" de la.
Nodurile audio sunt poziționate în mod prestabilit. Aceasta înseamnă că, dacă nu doriți să utilizați această funcție în anumite cazuri, puteți seta un anumit nod pozitional
proprietate la fals
.
În timp ce nu vom implementa acest lucru în jocul nostru, următorul exemplu este o metodă de adăugare a unui nod de muzică de fundal care buclează atâta timp cât face parte din scenă. În metoda, adăugăm și un nod de sunet de explozie care începe să se joace când îi spunem.
Rețineți că le importăm platformei AV Foundation cadru în partea de sus. Acest lucru este necesar pentru a accesa și a lucra cu avAudioNode
proprietatea unui SKAudioNode
obiect. După cum puteți vedea, nodurile audio sunt foarte ușor de configurat și de utilizat în SpriteKit.
import AVFoundation func addAudioNode () listener = player lasă backgroundMusic = SKAudioNode (fileNamed: "backgroundMusic") backgroundMusic.positional = false explozie explozie = SKAudioNode (fileNamed: "explosion") explosion.autoplayLooped = false addChild (backgroundMusic) nu try explion.avAudioNode? .engine? .start () // Chemat atunci când doriți să redați sunetul captura // Faceți ceva cu eroarea
Ar trebui să vă simțiți confortabil să lucrați cu unele dintre cele mai avansate efecte ale SpriteKit, inclusiv sistemele de particule, filtrele, lumina și audio. Aceste efecte combinate pot avea un impact semnificativ asupra aspectului jocului dvs. și cât de imersiv este acesta.
În ghidul următor și final al acestei serii, acoperim unele dintre cele mai bune practici pe care trebuie să le țineți minte atunci când lucrați cu SpriteKit. De asemenea, vă arăt cum să creați atlasuri de textură și să salvați / încărcați scene.
Ca întotdeauna, asigurați-vă că părăsiți comentariile și comentariile dvs. în comentariile de mai jos.