当他们在某个时刻到达时消灭精灵身体

时间:2012-07-12 12:09:12

标签: cocos2d-iphone

当我们在某个时刻到达时,我怎么能破坏精灵。 我知道破坏精灵的代码,但不知道条件。 我的精灵通过加速度移动,当他们到达屏幕右下角时,我想要破坏那个精灵...

请给我一个代码或提示做什么。请帮帮我

谢谢

3 个答案:

答案 0 :(得分:0)

每当你获得精灵的位置时,执行下面的代码来删除boxBody。它适用于带有Box2D Physics的cocos2D。 根据标签添加Sprite到图层时使用标记,将删除Body。使用此代码不会删除精灵。

-(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;
            }               
        }
    }
}

答案 1 :(得分:0)

您需要做的是称为精灵剔除。

您可以通过多种方式完成此操作。这里有几个简单的方法:

  1. 安排一个sprite culler,用于评估您可能要杀死的所有精灵的位置,并从屏幕中删除它们。根据您需要的精度,根据需要调整计划时间。

  2. 使剔除者成为一个节点(或一系列节点)并将其置于屏幕外。提供碰撞检测,以便您可以检测到精灵何时到达剔除者。当精灵与剔除者碰撞时,它可以将它们从屏幕上移除。

答案 2 :(得分:0)

使用此代码可避免崩溃。安全和定时的破坏。

-(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");
}
}