4. diel - Strieľanie rakiet a ďalšie časticové efekty vo SpriteKit
V predchádzajúcej lekcii, Nepriatelia a ich pohyb vo SpriteKit , sme úspešne rozpohybovali nepriateľov. Je na čase pridať do hry arzenál. Implementujeme strieľanie rakiet hráčom.
Strieľame rakety
Loď hráča a neskôr tiež nepriatelia budú strieľať rakety, aby sme hru poriadne oživili. Začneme implementáciou rakiet hráča. V prvom rade potrebujeme obrázok:
Modely
Pretože sa nám začína GameScene
dosť plniť a vytvorenie a
nastavenie rakiet by malo byť záležitosťou objektu hráča, vytvoríme si
novú triedu Player
, ktorá bude dediť od
SKSpriteNode
. Rovno som si vytvoril novú group v projekte
pomenovanú Model
. Neskôr si totiž vytvoríme aj vlastnú triedu
pre nepriateľov.
Jediný menší zádrhel je metóda init()
, pretože musíme
použiť predvolené, aby bol kompilátor spokojný, a zároveň implementovať
ďalšie povinnú. Bude to vyzerať takto:
import SpriteKit class Player: SKSpriteNode { init() { let texture = SKTexture(imageNamed: "player") super.init(texture: texture, color: .clear, size: texture.size()) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
Potom už stačí v GameScene.swift
zmeniť, ako sa hráč
vytvára:
let player = Player()
Tvorba rakiet
A teraz sľubované rakety. Našou novej triede Player
pridáme
metódu createMissiles()
, ktorá bude vracať
SKNode
.
Podobne ako u nepriateľov, aj pre dvojicu rakiet využijeme "kotvu" pre ľahšie pozicovanie a animovanie:
func createMissiles() -> SKNode { let missilesAnchor = SKNode() missilesAnchor.position = position missilesAnchor.zPosition = -1 // Sem budeme ještě psát další kód... return missilesAnchor }
Pozíciu nastavíme na aktuálnu pozíciu hráča a rovno nastavíme nižšia
zPosition
, aby boli rakety pod hráčom. Teraz vytvoríme dva
objekty našej rakety, pre tvorbu druhého som opäť zvolil kopírovanie:
let missile1 = SKSpriteNode(imageNamed: "playerMissile") let missile2 = missile1.copy() as! SKSpriteNode
Čo sa týka pozicovanie, tak tu záleží, aký používate model pre hráčov. Pre ten môj bude každá z rakiet na jednom krídle:
missile1.position = CGPoint(x: 25, y: -5) missile2.position = CGPoint(x: -25, y: -5)
Zostáva rakety pridať pod missilesAnchor
a tento objekt
vrátiť:
missilesAnchor.addChild(missile1)
missilesAnchor.addChild(missile2)
return missilesAnchor
Pohyb rakiet
Rovno môžeme v triede Player
vytvoriť SKAction
pre pohyb rakiet:
static var missileMovement: SKAction { let move = SKAction.moveBy(x: 0, y: 1500, duration: 3) let remove = SKAction.removeFromParent() return SKAction.sequence([move, remove]) }
Týmto zaistíme, že sa raketa dostane ďaleko mimo obrazovku a až potom ju
odoberieme. Rýchlosť 3
sekundy mi príde optimálna, ale môžete
si nastaviť vlastné.
Odpálenie rakiet
A konečne sa dostávame k odpáleniu rakiet! Vráťme sa do
GameScene.swift
a najskôr si založíme premenou pre
Timer
, ktorý sa bude starať o streľbu hráča:
var playerFireTimer: Timer?
Potrebujeme metódu, ktorú bude náš nový timer v pravidelných intervaloch volať. V nej rovno pridáme a spustíme rakety:
@objc func playerFireTimerTick() { let missiles = player.createMissiles() addChild(missiles) missiles.run(Player.missileMovement) }
A náš timer v didMove()
nakonfigurujeme:
playerFireTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(playerFireTimerTick), userInfo: nil, repeats: true)
Parameter timeInterval
je na vás, záleží, ako rýchlo
chcete, aby mohol hráč "KOSIT" nepriateľov. Treba ho neskôr môžeme
zapracovať do obtiažnosti?
Hru môžeme zapnúť a pozrieť sa na výsledok:
Časticové efekty
Rakety už lietajú, ale zatiaľ celkom nudne. Preto je teraz oživíme časticovými efektmi.
Vytvorenie efektu ohňa
Vytvoril som si rovno novú group pomenovanú Particles
a
presunul tam SpaceDust.sks
. Rovno vytvoríme nový súbor
pomenovaný RocketFire.sks
. Ako šablónu zvolíme "Fire".
Ak sa chcete zbaviť varovanie o duplicitnej obrázkov pre častice, stačí
otvoriť Assets.xcassets
na úrovni projektu a zmazať položku
"Particle Sprite Atlas".
Môj obrázok rakety je široký 12 bodov, takže to isté je potrebné
nastaviť časticiam. Ako prvý nastavíme teda "Position Range" a to
6
pre X (čiže polovicu šírky rakety) a 0
pre Y.
Ďalej "Angle" na 270
, aby sme pohyb častíc správne
otočili.
Ďalej som nastavil "Birthrate" na 200
, potom tiež "Speed" na
300
a "Range" u "Speed" na 50
. No a potom už len
"Alpha" na 1
.
Opäť pripomínam, že sa jedná o vašu hru a môžete si vyrobiť také efekty, ktoré sa páči vám.
Efekt vyzerá zhruba takto:
Použitia efektu
Teraz už stačí nové častice použiť. Máme pripravenú triedu
Player
a vytvorenie častíc vykonáme v metóde
createMissiles()
a to hneď za nastavením pozícií pre naše
rakety:
if let missile1Fire = SKEmitterNode(fileNamed: "RocketFire") { missile1Fire.zPosition = -2 missile1Fire.position.y = -(missile1.size.height / 2) missile1.addChild(missile1Fire) let missile2Fire = missile1Fire.copy() as! SKEmitterNode missile2.addChild(missile2Fire) }
Vytvorenie SKEmitterNode
už poznáte. Ďalej nastavíme
zPosition
pod naše rakety a pozíciu na "koniec" našej rakety.
Oheň stačí pridať pomocou addChild()
a využiť
copy()
pre vytvorenie časti pre druhú raketu.
Hru môžeme vyskúšať, celé to vyzerá o poznanie lepšie:
Zvukové efekty
Na záver dnešnej lekcie si pridáme zvukový efekt a to na vystrelenie
rakiet. Najväčší problém bude zrejme nájsť zvuk vypálené rakety. Vy
môžete použiť čokoľvek, ak hru nebudete šíriť. Ja som chvíľu na
internete hľadal "rocket launch free sound effect" a jeden taký našiel.
Vytvoril som si novú zložku v projekte pomenovanú Sounds/
a
.wav
súbor tam skopírovali.
Prehranie zvuku
Prehrávanie zvuku je vo SpriteKit veľa jednoduché. Bude nám stačiť
jedna SKAction
. Vytvoríme si konštantu pre prehrávanie efektu v
našej GameScene
:
let rocketLaunchSoundAction = SKAction.playSoundFileNamed("rocketLaunch", waitForCompletion: false)
Samozrejme namiesto "rocketLaunch"
zadajte názov vášho
zvukového súboru
A potom stačí spustiť priamo v hernej scéne pri vypálení rakety:
@objc func playerFireTimerTick() { let missiles = player.createMissiles() addChild(missiles) run(rocketLaunchSoundAction) missiles.run(Player.missileMovement) }
SKAction
by šlo vytvoriť priamo v tomto kroku, mal som ale
pocit, že to spôsobuje drobné zaseknutiu hry, tak som si ju pripravil ako
konštantu.
V budúcej lekcii, Nepriatelia strieľa späť a dokonca laserom vo SpriteKit , začnú nepriatelia strieľať späť.
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é 14x (651.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Swift