【アプリ開発日記】配列に格納したオブジェクトは、ループ中に消しちゃ駄目【シューティングゲーム】


シューティングゲームのテストバージョンをコツコツ作成しております。
当初、いろんなサイト様からコピペして弾とか敵とか作っていたのですが、
正直「なぜ」そうなるのかわからなかったので、
買っちゃいました。

高いよ。姉さん。
ゴホンゴホン

いや、まぁせっかくシューティングゲームを作るのだから
ちゃんとしたプログラムの組み立て方を知りたいなと思いまして買いました。
これを見ながら現在は、敵の攻撃方法実装しているところです(まだ一つだけですが)

今回のブログの記事タイトルの件ですが、



敵の弾との衝突判定をする際に、
画面に表示した画像(弾)のオブジェクトを一旦配列に格納しています。
(共通変数というんですかね)

それをスケジューラの中で毎回すべて呼び出して
主人公の画像と衝突判定をチェックしているのですが。

衝突した際に、画像(弾)のオブジェクトを削除させようと
ソースを書いた際にエラーになります。

メッセージはこんな感じ

Terminating app due to uncaught exception ‘NSGenericException’, reason…

メッセージをそのまま検索したところ、
ループ内でオブジェクトを削除してはいけないメモ
やっぱりだめだと

解決策を探していたら、こんな感じのものを見つけました。
ダイナミックObjective-C

リスト5にある書き方をすれば正常に動くのですが
いまいち理解が出来ない。

ここに書かれている”reverseObjectEnumerator”というもの使用すればうまく動きます。

しかし、”逆”から配列を走査するというのはどういうことなのでしょう?
単純に「一番最後の要素から処理を実施している。」では、
”弾”の画像オブジェクトは複数存在する訳で
三発目ぐらいで衝突した場合は、結局一発目と二発目の要素の処理するわけで、、、うーん

もしくは説明に書かれている、”一旦配列をコピーして”るから大丈夫なんだろうか?
しかしそもそも一旦コピーするってことは、その分処理が重くなっていないのだろうか。。。

疑問は残りますが、いまのところこれでいい感じに動いておりますw

※シューティングではないですが最新作です!