Ios Box2d动态对象之间的碰撞
我想用Box2d做一个简单的射击游戏 敌人和子弹都是充满活力的身体。我在屏幕左侧创建敌人,然后对他们施加线性力,使他们向右移动。玩家需要击中敌人三次才能杀死它 我的问题是,当敌人头两次被子弹击中时,我如何让它继续移动?现在,当敌人第一次被击中时,它将被击倒甚至击出屏幕。我希望敌人只有在被杀死(第三次被击中)时才会这样做。我该怎么做 谢谢你的建议 这里有一些代码:Ios Box2d动态对象之间的碰撞,ios,objective-c,cocos2d-iphone,box2d,kobold2d,Ios,Objective C,Cocos2d Iphone,Box2d,Kobold2d,我想用Box2d做一个简单的射击游戏 敌人和子弹都是充满活力的身体。我在屏幕左侧创建敌人,然后对他们施加线性力,使他们向右移动。玩家需要击中敌人三次才能杀死它 我的问题是,当敌人头两次被子弹击中时,我如何让它继续移动?现在,当敌人第一次被击中时,它将被击倒甚至击出屏幕。我希望敌人只有在被杀死(第三次被击中)时才会这样做。我该怎么做 谢谢你的建议 这里有一些代码: // Apply force rock.isFlying = 1; b2Vec2 force = b2Vec2
// Apply force
rock.isFlying = 1;
b2Vec2 force = b2Vec2(-2.0f*distance*cos,-2.0f*distance*sin);
rockBody->ApplyForce(force,rockBody->GetWorldCenter());
rockBody->SetLinearDamping(0.2f);
- (void)birdFly:(ccTime)dt{
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
ZLBird *myBird = (__bridge ZLBird*)b->GetUserData();
if (b->GetUserData() != NULL && myBird.tag == TAG_BIRD)
{
// Apply force
b2Vec2 gravityOffset;
gravityOffset.x = 0;
gravityOffset.y = myBird.multiplier*(myBird.startY - myBird.position.y);
if (!myBird.isDead)
b->ApplyForce(gravityOffset , b->GetWorldCenter());
}
}
}
void ContactListener::BeginContact(b2Contact* contact)
{
b2Body* bodyA = contact->GetFixtureA()->GetBody();
b2Body* bodyB = contact->GetFixtureB()->GetBody();
CCSprite* spriteA = (__bridge CCSprite*)bodyA->GetUserData();
CCSprite* spriteB = (__bridge CCSprite*)bodyB->GetUserData();
if (spriteA != NULL && spriteB != NULL)
{
// if hit by rock
if (spriteA.tag == -1 && spriteB.tag == TAG_BIRD){
ZLBird *myBird = (__bridge ZLBird*)bodyB->GetUserData();
ZLRock *myRock = (__bridge ZLRock*)bodyA->GetUserData();
[myBird getHurt];
}
else if(spriteB.tag == -1 && spriteA.tag == TAG_BIRD) {
ZLBird *myBird = (__bridge ZLBird*)bodyA->GetUserData();
ZLRock *myRock = (__bridge ZLRock*)bodyB->GetUserData();
[myBird getHurt];
}
}
}
联系人侦听器中的preSolve和postSolve回调方法在这里很有用。可以在preSolve()方法中设置SetEnabled(false),以便box2d不会计算应用于实体的所需力。i、 e.box2d将跳过碰撞。但请注意,这仅适用于特定的时间步长持续时间。在下一个box2d时间步中,将计算碰撞。为了在头两次跳过岩石和鸟之间的完全碰撞,您需要在每一帧中调用SetEnabled(false),但要进行检查。比如说 在岩体的用户数据中取一个整数。在每个时间步中,您只需调用SetEnabled(false)并递增整数,直到整数变为2。一旦该值为2,则下次继续时不要调用SetEnabled(false)。默认情况下,它将设置为SetEnabled(真)。在第三次撞击中,box2d将对岩体施加作用力 你必须读书
具体阅读preSolve和postSolve回调。我们能看到一些代码吗?当然!我刚刚编辑了这个问题。我可以看看getHurt方法吗?-(void)getHurt;{health--;如果(health==0)isDead=1;}//当isDead为真时,敌人将从场景中移除。实际上,我只是想知道如何使动态实体不受碰撞影响,并将其设置回对碰撞敏感的状态