2014-03-07 24 views
0

感谢您的时间!如何在延迟时间后删除sprite/b2body?

我正在用box2d做一个项目。当我第一次触摸屏幕,一只鸟会在Box2D的世界中创建,如下

- (void)createBird 
{  
//init bird 
bird = [CCSprite spriteWithFile:@"bird.png"]; 
bird.scale = 23/[bird boundingBox].size.width; 
bird.position = center; 
[self addChild:bird z:12]; 
} 

然后,如果触摸结束,鸟会给出一个力

//add box2d body 
    b2BodyDef birdBodyDef; 
    birdBodyDef.type=b2_dynamicBody; 
    birdBodyDef.userData = (__bridge void*)bird; 
    birdBodyDef.position.Set(bird.position.x/PTM_RATIO,bird.position.y/PTM_RATIO); 
    birdBody=world->CreateBody(&birdBodyDef); 

    //create circle shape 
    b2CircleShape birdShape; 
    birdShape.m_radius=([bird boundingBox].size.width-6)/PTM_RATIO/2; 

    // Create shape definitio and add to body 
    b2FixtureDef birdFixtureDef; 
    birdFixtureDef.shape=&birdShape; 
    birdFixtureDef.density=1.6f; 
    birdFixtureDef.friction=0.3f; 
    birdFixtureDef.restitution=0.3f; 
    birdFixture = birdBody -> CreateFixture(&birdFixtureDef); 

    // Apply force 
    b2Vec2 force = b2Vec2(-2.0f*distance,-2.0f*distance); 
    birdBody->ApplyForce(force,birdBody->GetWorldCenter()); 
    birdBody->SetLinearDamping(0.2f); 

然后,当我再次触摸屏幕,另一只鸟将使用“createBird”方法创建。

我想删除第一只鸟,创建5秒之后。但那时候,“CCSprite * bird”和“b2Body * birdBody”会指向第二只鸟,那么我该如何删除第一只鸟呢?

谢谢!

回答

0

我不确定我完全理解你的问题,但这可能有帮助。在创建新的鸟之前打电话。

if (bird) { 

    id delayTimeAction = [CCDelayTime actionWithDuration:5.0]; 

    id removeMySprite = [CCCallFuncND actionWithTarget:bird selector:@selector(removeFromParentAndCleanup:) data:(void*)NO]; 

    [bird runAction:[CCSequence actions: delayTimeAction, removeMySprite, nil]]; 

} 

编辑:

初始化数组

NSMutableArray *birds = [NSMutableArray new]; 

然后调用这个在创建禽流功能

[birds addObject:newBird]; 

if ([birds count] > 1) { 
    oldBird = [birds firstObject]; 
    //Call remove function on oldBird 
    [birds removeObject:oldBird]; 
} 
+0

感谢您的回复!但是对于“actionWithTarget:bird”,现在这只鸟是指新鸟,而不是第一只。我想知道如何删除第一个。我想我应该使用一个NSMutableArray,但我不太确定如何做到这一点。 – alanlzl

+0

检查我的编辑,我希望它很明确 – wingNut86

+0

谢谢!这有帮助! – alanlzl

0

一个办法是让你的鸟标签,然后保存他们进入一个Nsmutuable字典。 继续遍历该字典,然后在你的布尔变量销毁已被设置销毁尸体.....

我已经做了类使用类似的事情....事实是,你将需要摧毁身体任何案件。 (否则你将面临FPS问题)