【发布时间】:2014-03-30 23:08:19
【问题描述】:
我正在尝试用 Box2d 制作一个简单的射击游戏。
敌人和子弹都是动态物体。我在屏幕左侧创建敌人,然后对它们施加线性力,使它们向右移动。玩家需要击中敌人 3 次才能杀死它。
我的问题是,我怎样才能让敌人在前两次被子弹击中时保持移动?现在,当敌人第一次被击中时,它会被击倒甚至被击出屏幕。我希望敌人只有在被击杀(第三次被击中)时才会如此。我该怎么做?
感谢您的任何建议!
这里有一些代码:
// 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];
}
}
}
【问题讨论】:
-
我们可以看看一些代码吗?
-
当然!我刚刚编辑了问题。
-
能看到getHurt方法吗?
-
- (void) getHurt; { 健康 - ; if (health == 0) isDead = 1; } // 当 isDead 为真时,敌人将从场景中移除
-
其实我只是想知道如何让一个动态的物体不受碰撞的影响,并在以后将其设置为对碰撞敏感
标签: ios objective-c cocos2d-iphone box2d kobold2d