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í.

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:

textúra rakety - Tvorba iOS hier vo Swift

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:

Strieľanie rakiet v iOS hre pomocou SpriteKit - Tvorba iOS hier vo Swift

Č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:

Časticový efekt rakety vo Swift a SpriteKit - Tvorba iOS hier vo Swift

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:

Strieľanie rakiet s časticovými efektmi vo Swift a SpriteKit - Tvorba iOS hier vo Swift

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

 

Predchádzajúci článok
Nepriatelia a ich pohyb vo SpriteKit
Všetky články v sekcii
Tvorba iOS hier vo Swift
Preskočiť článok
(neodporúčame)
Nepriatelia strieľa späť a dokonca laserom 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