Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

8. diel - Ďalšie časticové efekty vo SpriteKit

V minulej lekcii, Dokončenie kolízií vo SpriteKit , sme sprevádzkovali kolízie pri strieľaní. Hra už obstojne funguje, ale stále je to také suché, nemyslíte? Skvelá príležitosť pridať si časticové efekty explózie a lasera.

Efekt explózie

Začneme efektom explózie.

Vytvorenie efektu

Vytvoríme teda nový súbor pomenovaný Explosion.sks a ako šablónu vyberieme opäť oheň.

Najdôležitejšie je tu nastavenie pre Emitter, kde zvolíme Birthrate 900 a Maximum 300. Tým zabezpečíme, že sa veľmi rýchlo zobrazí 300 častíc a ďalšie už nebudú vytvorené. Designer v Xcode prehráva preview stále dookola, pri použití ale uvidíme iba jeden výbuch.

Ďalej som nastavil Lifetime na 0.4, aby častice rýchlo zmizli. Position Range 10 pre X a Y. Nastavenie Angle na 0 ° a Range na 360 ° zaistí rovnomernú explózii do všetkých smerov. Speed som nastavil na 200 a Range na 50. Acceleration na 0 pre X a Y.

Potom som ešte upravil Color Ramp pre úpravu farby. Kliknutím na slider pridáte druhý kontrolný bod a klikom na neho môžete upraviť farbu. Zvolil som svetle oranžovú a kontrolný bod posunul, viď obrázok nižšie:

Tvorba iOS hier vo Swift

Myslím, že výsledok nevyzerá vôbec zle :-) :

Explózia vo SpriteKit hre pre iOS vo Swift - Tvorba iOS hier vo Swift

V skutočnej hre by to samozrejme chcelo viac variantov explózie. Takže by ste mohli prvý výsledok skopírovať a mierne upraviť parametre, aby nepriatelia nebouchali tak repetitívne.

Spustenie efektu

Upravíme metódu missileHit(), kde najskôr nastavíme name oboch objektov na nil a vytvoríme explózii. Tú nastavíme na bod kontaktu:

missile.name = nil
enemy.name = nil
if let explosion = SKEmitterNode(fileNamed: "Explosion") {
    explosion.position = point
    explosion.zPosition = 5
    addChild(explosion)
}

Mená nastavujeme na nil ako poistku, aby náhodou nedošlo k rozpoznaniu druhého kontaktu medzi objektmi, s ktorými ešte pracujeme.

Pre odobratie nepriateľa môžeme ešte vytvoriť krátku SKAction s animáciou, aby okamžite nezmizol:

let fadeOut = SKAction.fadeIn(withDuration: 0.2)
let sequence = SKAction.sequence([fadeOut, SKAction.removeFromParent()])
enemy.run(sequence)

Samozrejme nezabudnite odstrániť pôvodný volanie enemy.removeFromParent().

Možno si všimnete drobné chybičky a síce, že môžeme zneškodniť nepriateľa, ktorý má už pripravenú laserovú strelu. Potom to vyzerá, že sa objavila z prázdna. To vyriešime neskôr.

Efekt zásahu laserom

Zásah raketou máme, teraz je čas na zásah hráča. Na záver lekcie teda pripravíme ďalšie časticový efekt a vyriešime kolízii lasera a hráča. Neskôr hráči pridáme životy, teraz bude zatiaľ nesmrteľný.

Vytvorenie efektu

Laser by mal skôr spôsobiť menšie dym ako plnohodnotnú explózii. Pridáme si teda nový súbor s časticami a ako šablónu vyberieme Smoke. Birthrate som nastavil na 900 a Maximum na 10. Ďalej Lifetime Štart na 0.5 a Range na 0.1. Position Range 5 pre X a 10 pre Y. Ďalej Angle Štart na 90 ° a Range 180 °, takže dôjde k pokrytie smeru, odkiaľ bude hráč zasiahnutý laserom. Speed Štart nastavíme na 40 a Range na 0. A konečne Alpha Start 0.2 a Range 0.1.

A výsledok:

Efekt laseru vo SpriteKit - Tvorba iOS hier vo Swift

Ako vždy môžete experimentovať a vytvoriť si vlastný efekt alebo pokojne niekoľko a striedať je náhodne.

Opäť platí, že opakovanie je vidieť iba v náhľade.

Pridanie efektu

Pridanie efektu po zasiahnutí hráča je skoro rovnaké ako u rakiet a nepriateľov. Pripravíme si metódu pre reakciu na zasiahnutie hráča:

func laserHitPlayer(_ laser: SKNode, at point: CGPoint) {
}

Pre objekt hráčov máme referenciu priamo v GameScene, takže parameter nie je potreba. Teraz stačí v didBegin() detekovať kolízii lasera a hráča:

if nodeA.name == "laser" || nodeB.name == "laser" {
    if nodeA.name == "player" {
        laserHitPlayer(nodeB, at: contact.contactPoint)
    } else {
        laserHitPlayer(nodeA, at: contact.contactPoint)
    }
}

Na koniec predchádzajúcej podmienky pre rakety som pridal return, aby zbytočne metóda neskúšala vyhodnotiť druhú podmienku, keď sme kolízii už spracovali.

A nakoniec zostáva doplniť metódu laserHitPlayer(). Najskôr vymažeme meno a pridáme efekt dymu:

laser.name = nil
if let laserHit = SKEmitterNode(fileNamed: "LaserHit") {
    laserHit.position = point
    laserHit.zPosition = 5
    addChild(laserHit)
}

Efekt pohltenie strely lodí

Bolo by pekné nejako zapracovať s objektom laserové strely. Môžeme skúsiť vytvoriť efekt, že je celá strela vplyvom nárazu "pohltená" loď hráča. To znie celkom komplexne. Pomocou SKAction môžeme zmeniť škálu (rozmer) buď celkovo alebo na osi X či Y. Keď zmeníme škálu Y na 0, môžeme tým dosiahnuť efekt, kedy bude animácií laserová strela zmenšená, ako by reagovala na zásah. Lenže bude zmenšená do svojho stredu. Môžeme si ale pomôcť druhú SKAction, ktorá zmenšujúca sa strelu posunie po osi Y a tým navodí dojem, že sa zmenšuje presne v bode, kde trafila loď hráčov :-)

Pretože je na strele už jedna aktívny SKAction pre jej pohyb, tak najskôr odstránime všetky akcie a potom pomocou guard přetypujeme objekt na SKSpriteNode. Budeme totiž potrebovať získať výšku:

laser.removeAllActions()
guard let laser = laser as? SKSpriteNode else { return }

Teraz už stačí "len" poskladať SKAction do sekvencie:

let shrink = SKAction.scaleY(to: 0, duration: 0.2)
let move = SKAction.moveBy(x: 0, y: -laser.size.height / 2, duration: 0.2)
let fadeOut = SKAction.fadeOut(withDuration: 0.1)
let group = SKAction.group([shrink, move])
let sequence = SKAction.sequence([group, fadeOut, SKAction.removeFromParent()])

laser.run(sequence)

Môžeme zakomentovat nastavenie timeru playerFireTimer a pozrieť sa, ako zásah laserom bude vyzerať:

Animácie zásahu laserom v iOS hre vo SpriteKit vo Swift - Tvorba iOS hier vo Swift

Aktuálne hra vyzerá takto:

Vesmírna strieľačka v SpriteKit vo Swift - Tvorba iOS hier vo Swift

V budúcej lekcii, Pridanie Parallax efektu a životov hráča vo SpriteKit , už budeme dolaďovať drobnosti. Pridáme hráči životy a ukážeme si paralax efekt.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 4x (962.35 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Swift

 

Predchádzajúci článok
Dokončenie kolízií vo SpriteKit
Všetky články v sekcii
Tvorba iOS hier vo Swift
Preskočiť článok
(neodporúčame)
Pridanie Parallax efektu a životov hráča vo SpriteKit
Článok pre vás napísal Filip Němeček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje vývoji iOS aplikací (občas macOS)
Aktivity