本日は、「戦闘不能処理処理がされないエネミーが存在する」というバグを修正しました。
このバグの原因は2つあります。
1つ目は、splice関数を使って配列の要素を削除した際に、lengthが短くなることを忘れていたことです。
エネミーが入っている配列をsplice関数で削除すると、その分配列が短くなります。
なので、forループなどでエネミー配列をチェックする際に、
for(i = 0; i < enemies.length; i++)という条件でループさせると、途中でHP0になったエネミー要素を削除した際にlengthが1短くなります。
しかし、for文で最初に定義したenemies.lengthは短くなる前の値が入ったままなので、領域外を参照して今うことになります。
これがバグの原因の一つでした。
2つ目の原因は、数字の0がBoolean型ではfalseとして扱われることを知らなかったことです。
こちらに書かれている通り、数字の0はBoolean型ではfalseとして扱われます。
僕は、攻撃可能なエネミーがいた場合、そのエネミーの配列番号を返す関数を作っていました。そして、もし攻撃可能なエネミーがいなかった場合はfalseを返すようにしていました。
もうお気づきたと思いますが、これだと0番目のエネミーが攻撃可能だった場合、数字の0が返ってきますが0はfalseなので条件式ではじかれてしまいます。
これらがこのバグの原因でした。
明日はフィールドのデザインの方をやっていこうと思います。
それではまた明日。