読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d】異なるテクスチャアトラスに同じ名前の画像ファイルを入れる時は注意!

cocos2d

App Storeへサブミットした後にバグがみつかりました。
エンディング後の2週目で原因不明のクラッシュが起きるという物です。
ゲームオーバー後の再スタートは成功しているので初期化はできているはずなのですが・・・

そこで気になったのがテクスチャアトラス。
エンディング用の背景がゲーム内のテクスチャアトラスに収まらなかったので別のファイルを作り、そこにゲーム内のテクスチャアトラスと同じ名前でミツバチのpng画像を入れています。

なんとなく同じ名前のファイルが何か悪さしているような気がして、テクスチャアトラスを読み込む前にpurgeしてみるとこれが成功。無事にクラッシュせずに2周目をプレイできるようになりました。

            [CCSpriteFrameCache purgeSharedSpriteFrameCache];
            [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"texture-atlas.plist"];

こんなふうにpurgeSharedSpriteFrameCacheを入れる事でエンディングに使ったキャッシュがクリアされ、新たにフレッシュなスプライトフレームキャッシュが作られるのだと思います。
これがcocos2dの仕様なのかバグなのかよくわかりませんが、エンディング用のテクスチャアトラスを読むときはクラッシュせず、再びゲーム用のテクスチャアトラスを読むと問題が出るようです。
これって結構ハマってしまうポイントな気がします。

purgeによる解決が本当に適切なのかどうか検索して調べてみると、同じ問題で苦しんだ方がいます。
この方の情報によると、解決策として、「purge」、「名前がだぶらないようにする」、の2つの方法が書かれています。なので、自信を持ってパージしておきます。

結構解決までに時間がかかりましたが、なんとかバグも修正し、アップルにアプリを再提出しました。