swiftのspritekitで敵に体力をもたせる方法

Swift Tips

はじめに


この記事ではswiftでシューティングゲームを作成する過程でつまづいたポイントや調べるのに苦労したコードなどをご紹介しています。
swiftでゲームを作る時に使うフレームワークspritekitの記事が中心になります。

今回はspritekitで敵のスプライトにどうやって体力を設定しているか?
について書いていきます。衝突判定で当たったスプライトノードを削除する方法は書籍やネットですぐわかったのですが、敵の体力についてはなかなか検索してもヒットせず、海外の掲示板でやっと見つけて解決しました。

こんなゲーム作りました


まずは私が作ったシューティングゲームをぜひプレイしてみてどんな感じに実装したか見てみて下さい。全6ステージの2D縦スクロールSTGです。
アプリ名:ネオリゲイナー


バージョンはxcodeが12.5、swiftが5.4で動作していますのでしばらくはこのコードで動作すると思います。

SKSpriteNodeのuserDataを使う


SKSpriteNodeにuserDataという非常に便利な入れ物があるんです。
下から2行目がその部分になります。
※当たり判定などは実装可能という前提で進めていきます。

let enemy = SKSpriteNode(imageNamed: "enemy")   //敵のスプライトノードを作成
       
//当たり判定
enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.frame.width / 2) //敵画像の半分サイズの円形で当たり判定する
enemy.physicsBody?.categoryBitMask = enemyCategory //敵自身のビットマスク
enemy.physicsBody?.contactTestBitMask = fireCategory + jikiCategory //自機のショットと自機自身のビットマスク
enemy.physicsBody?.collisionBitMask = 0

//体力を定義する
enemy.userData = ["health":10]  //healthという名前に10を代入する
        
self.addChild(enemy) //敵を現在のシーンに定義する

userDataに体力を入力したら必要な場所から(func didBegin等)関数を(今回の場合はDamageという名前)呼び出して体力を減らして、再度敵のuserDataに保存します。もし敵の体力が0以下になった場合はノードを削除します。

func Damage(){
//ダメージ処理
var enemyLife = (enemy.userData!["health"] as! Int) //敵の"health"から数字を取り出しInt型にてenemyLifeに代入
        
enemyLife -= 1  //ダメージとして1ひく

enemy.userData?.setValue(enemyLife, forKey: "health") //enemyLifeの値を今の体力としてenemyに代入

//敵の死亡処理
if enemyLife <= 0 {
                enemy.removeFromParent()  //enemyノードを削除
                }

}

これで敵の体力について設定できるようになりました。
userDataは複数の要素をいれておけるので、私は敵の体力の他に倒した時に入るスコアポイント数や敵が出すアイテムの数などを下記のように入れて、必要なところで参照して使用しています。

あと、数値だけでなくbool型も入れられるので、死亡時に変わったエフェクト処理をするかどうかの判定にも使用しています。

enemy.userData = ["health":60,"score":100,"point":2,"effect":true]

他にも敵の体力の方法があるかもしれませんが、私はこのやり方でゲームを作成しました。
ぜひ試してみて下さい。

タイトルとURLをコピーしました