ある時点でスプライトを破壊するにはどうすればよいですか。スプライトを破壊するコードは知っていますが、条件がわかりません。私のスプライトは加速して移動し、画面の右下隅に到達したときにそのスプライトを破壊したい...
コードまたはヒントを教えてください。私を助けてください
ありがとう
ある時点でスプライトを破壊するにはどうすればよいですか。スプライトを破壊するコードは知っていますが、条件がわかりません。私のスプライトは加速して移動し、画面の右下隅に到達したときにそのスプライトを破壊したい...
コードまたはヒントを教えてください。私を助けてください
ありがとう
このコードを使用して、クラッシュを回避してください。安全で時限破壊。
-(void) tick: (ccTime) dt
{
...
std::vector<b2Body *>toDestroy;
std::vector<b2Body *>::iterator pos;
for (b2Body* b = _world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != NULL)
{
CCSprite *temp1 = (CCSprite*)b->GetUserData();
if(temp1.tag == kTagSpriteOnWish)
{
temp1.tag = kTagExpiredSprite;
temp1.visible = false;
[self performSelector:@selector(removeSprite:) withObject: temp1 afterDelay:1.5];
toDestroy.push_back(b);
}
}
}
for (pos = toDestroy.begin(); pos!=toDestroy.end(); ++pos)
{
b2Body *body = *pos;
world->DestroyBody(body);
body= NULL;
}
}
-(void)removeSprite:(id)sender
{
CCSprite *spr = (CCSprite*)sender;
[spr removeAllChildrenWithCleanup:YES];
[spr removeFromParentAndCleanup:YES];
// printf("Removed ice block\n");
}
}
あなたがしなければならないことは、スプライトカリングと呼ばれます。
いくつかの方法があります。ここでは、いくつかの簡単なアプローチがあります。
殺す可能性のあるすべてのスプライトの位置を評価するスプライト カラーをスケジュールし、それらを画面から削除します。達成する必要がある精度に従って、必要に応じてスケジュール時間を調整します。
カラーをノード (または一連のノード) にして、オフスクリーンに配置します。衝突検出を提供して、スプライトがいつカラーに到達したかを検出できるようにします。スプライトがカラーと衝突すると、スクリーンからそれらを取り除くことができます。
スプライトの位置を取得するたびに、以下のコードを実行して boxBody を削除します。Box2D Physics を使用した cocos2D 用です。スプライトをレイヤーに追加するときにタグを使用し、タグに基づいてボディの削除が行われます。このコードではスプライトは削除されません。
-(void) deleteBoxBody :(int) passTag
{
for (b2Body* b = _world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != NULL)
{
CCSprite *temp1 = (CCSprite*)b->GetUserData();
if(temp1.tag == passTag)
{
// NSLog(@"Destroying here");
_world->DestroyBody(b);
[self removeChild:temp1 cleanup:YES];
return;
}
}
}
}