0

私はiPhoneゲームの初期の構築段階にあり、スプライトシートを使用してランダムな人物を作成しています。各人物には、髪の毛や衣類などのサブスプライトがあります。

CCSpriteBatchNodeを使用してスプライト画像をスプライトシートに保存しています。現在、初期設定テストを行っています。画面をタップして、新しいランダムな人のセットを生成します。奇妙なことに、一度タップすると古い人が削除されて新しい人に置き換えられますが、2回目は、「CCSpriteBatchNodeにスプライトが含まれていません。削除できません」というエラーでクラッシュします。これで、スプライトがバッチノードに追加されたと確信しています。Person.mコンストラクターに次の行があります。

        [spriteSheet addChild:person];

ccTouchesEndedのテストコードには、次のコードがあります。

//updated with changes suggested by Mazyod and Jer
for(int i=6; i>=0; i--){
    Person *per = [_people objectAtIndex:i];
    [_people fastRemoveObjectAtIndex:i];
    [_spritesheet removeChild:per cleanup:YES];
    per = nil;
}


for(int i = 0; i < 7; i++){
    Person *per = nil;
    per = [Citizen personFromCountry:_country1 WithSpriteSheet:_spritesheet];
    per.position = ccp(100 + (50 * i),160);
    [_people addObject:per];
    [_spritesheet addChild:per];
}

誰かが私が欠けているものを提案できますか?cocos2dのスプライトシートについてたくさん読んだことがありますが、個々のスプライトを削除するのは難しいことを理解しているので、ここに追加する必要のある重要な行がいくつかあると確信しています。ご協力いただきありがとうございます!

編集: 私はエラーをグーグルで検索し、このスレッドを見つけました:http: //www.cocos2d-iphone.org/forum/topic/17170これは、Cocos2dがスプライトをスプライトシートに追加していないと考えていることを確認しているようです-しかし、私はスプライトが最初は正しく追加され、2回目は正しく追加されないという事実によって証明されています。

1つの解決策は、スプライトをまったく削除せずに、スプライトを非表示にして、再利用する必要があるときに新しい特性で再描画することです。それがよりきれいに見えるので、私はむしろ本当の解決策が何であるかを知りたいです。

4

3 に答える 3

1

さて、私はあなたが今のところ一つのことを片付けるのを手伝うことができます:

CCNodeは、1つの親の子にしかなれません。つまり、ひとり親が必要です。

しかし、あなたがここに持っているもの:

for(int i=0; i<7; i++){
    Person *per = [_people objectAtIndex:i];
    [self removeChild:per cleanup:YES];
    [_spritesheet removeChild:per cleanup:YES];
    per = nil;
}

その人をspriteSheetとselfの両方に同時に追加しようとしていることを提案します。ログを確認してください。次のようなものである必要があります。

cocos2d:removeChild、子が見つかりません。

そして、あなたが得ているエラーから、私はその人がスプライトシートではなく自分自身に追加されているに違いありません。

それで、これをどのように解決するのですか?

さて、あなたはその人を子供としてspriteSheetに追加し、次にspriteSheetを子供として自分自身に追加する必要があります。(実際には、それらを追加する順序は重要ではありません)。

これを整理すれば、おそらくこの問題はなくなるか、少なくとも私たちがあなたを助けることができるようにそれはより明確になるでしょう。

于 2012-02-20T07:49:29.423 に答える
1

変更する必要があるようです

[_people addObject:per];

[_people replaceObjectAtIndex:i withObject:per];

最初のループでは、配列内のオブジェクトの値をnilに設定しているだけで、配列からオブジェクトを削除していません。2番目のループでは、配列の最後に追加するだけですが、配列にはすでに7つのnilが含まれています。

動作するかどうか教えてください。

于 2012-02-20T22:36:58.003 に答える
1

ここで、この問題に関する私の経験と、それをどのように解決したかについて説明したいと思います。

追加されたことのない子を削除しようとしていることを忘れないでください。

また

子供を2回削除しようとしています。

これは私の場合でした。私のゲームでの衝突検出はしっかりしていました(少なくとも私は思っていました)。次に、ランダムに、7〜10回の実行ごとに1回のように...このクラッシュが発生します。発射物がターゲットと交差したら削除されるようにコード化したためだと気づきました。

ただし、ティックメソッドが一度に1つ以上のターゲットと衝突していることを検出した場合はフェイルセーフを設定しませんでした。

これは、すべての発射体について、各ターゲットを繰り返して衝突をチェックし、衝突が検出された場合はそれぞれの発射体を削除したためです。そこで、単純なBOOLを作成し、それがすでにターゲットと衝突している場合はYESに設定しました。次に、発射物が何にも衝突しなかった場合にのみ、衝突をチェックしました。

だから...前に:

if (CGRectIntersectsRect(projectileRect, targetRect))
{
//code to remove projectile
}

後:

if (CGRectIntersectsRect(projectileRect, targetRect) && projectile.hasHitaTarget == NO)
{
//code to remove projectile
}
于 2012-11-14T00:17:00.530 に答える