【问题标题】:Box2d collision between dynamic objects动态对象之间的 Box2d 碰撞
【发布时间】: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


【解决方案1】:

联系人监听器中的 preSolve 和 postSolve 回调方法在这里会很有帮助。您可以在 preSolve() 方法中设置 SetEnabled(false),这样 box2d 就不会计算施加在实体上所需的力。即 box2d 将跳过碰撞。但请注意,这仅适用于该特定时间步长持续时间。在下一个 box2d 时间步中,将计算碰撞。为了在前两次跳过岩石和鸟之间的完全碰撞,您需要在每一帧中调用 SetEnabled(false),但要进行检查。所以例如

在岩体的用户数据中取一个整数。在每个时间步中,您只需调用 SetEnabled(false) 并递增整数,直到整数变为 2。一旦这是 2,那么下次不要调用 SetEnabled(false)。默认情况下,它将设置为 SetEnabled(true)。在第三次命中时,box2d 将对岩体施加力。

你必须阅读http://www.iforce2d.net/b2dtut/collision-anatomy

具体阅读 preSolve 和 postSolve 回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多