現在のプログラムでは、火の玉に当たっても火の玉が消えないため、プレイヤーがノックバックして複数回当たってしまうということがありました。
火の玉を消すために以下のようなプログラムを使用していて、
if(this.px == targetplayer.px && this.py == targetplayer.py){
this.fire = false;
this.firecnt = 0;
this.px = 21;
this.py = 1;
}
プレイヤーと火の玉の座標が同じになった時に、画面外に火の玉を移動して消えているように見せるプログラムだったのですが、どうしてか上手く動作しませんでした。
理由としては、火の玉が当たったタイミングでプレイヤーのノックバックも発生してしまうため、同じ座標にならないみたいな感じがしていますが、真偽は不明です。
では次に、どうやって火の玉を消えているように見せるかですが、火の玉のHPを利用してプレイヤーに当たったタイミングで、HPを減らして消すという方法も考えましたが、一度HPがなくなってしまった火の玉(プログラム上はモンスター扱い)を、もう一度火の玉を放つときに表示できるようにするなど、プログラムを組むのが少し難しそうだと思ったので、没となりました。
他の方法を自分では思いつかなかったため、ChatGPTを利用してみると、JSファイルのdamagecheckの部分に火の玉専用の当たり判定を追加すれば良いとのことなので、下記のプログラムを追加しました。
// 🔥 firemonster専用(imgFire画像)の当たり判定
if (pmonster.imgid === "imgFire") {
// プレイヤーと火の玉が同じマスに来たら
if (xdis === 0 && ydis === 0) {
pplayer.life--;
sndDamage.play();
// fireを消す
pmonster.fire = false;
pmonster.firecnt = 0;
pmonster.px = 21;
pmonster.py = 1;
}
return;
}
試してみたところ問題なく動作しました。このプログラムでは、プレイヤーがダメージを受けた際のノックバックが無くなってしまっていますが、飛び道具のダメージにノックバックは無くても良いと思いますし、ノックバックを追加したら正常に動かなくなる可能性もあるため、このままのプログラムでいこうと思います。