Box2D - 根据标准穿过并摧毁尸体

时间:2014-05-30 00:11:26

标签: objective-c cocos2d-iphone box2d

我是Box2D的新手,我真的需要你的帮助!在我使用Cocos2D for iPhone的游戏中,如果他们以给定的速度行进,我希望我的身体能够破坏它们。现在,我所有的身体都是动力学而不是传感器。当发生碰撞时,我会调用一个函数来判断板条箱是否应该断裂。这是代码:

- (void) contactWithPlayer:(Player *)_player{
    float recquiredVelocity = 8.5;
    b2Vec2 vel = _player.body->GetLinearVelocity();
    float playerVelocity = ABS(vel.x) + ABS(vel.y);

    NSLog(@"Player speed : %f", playerVelocity);

    if (playerVelocity >= recquiredVelocity) {
        [self breakCrate]; //Function that destroy the crate's body in the b2world
    }
}

一切都很好,但是我想要达到的目标是如果打包机以降低的速度打破对象的话。现在,我的播放器只会反弹!我试图重新使用vel变量并将其应用于玩家的身体,但是在那一步,玩家已经开始向另一个方向移动了!我试图降低板条箱的密度,但它感觉不自然!

有人有解决方案吗?提前谢谢!

编辑:我现在使用的代码是借用Ray Wenderlich关于使用Box2D碰撞两个对象的教程的代码。所以我有一个名为MyContactListener的类,它在向量中添加碰撞对象,稍后在我的游戏场景中的更新循环中使用。这是更新循环:

- (void) update:(ccTime)delta{
    [self checkCollision];
}

- (void) checkCollisions{
    //COLLISIONS
    std::vector<MyContact>::iterator pos;
    for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;

        b2Body *bodyA = contact.fixtureA->GetBody();
        b2Body *bodyB = contact.fixtureB->GetBody();
        if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
            GameObject *spriteA = (GameObject *)bodyA->GetUserData();
            GameObject *spriteB = (GameObject *)bodyB->GetUserData();

            if (spriteA.type == o_PLAYER && spriteB.type != o_PLAYER) {
                [spriteB contactWithPlayer:(Player*)spriteA];
            }else if (spriteB.type == o_PLAYER && spriteA.type != o_PLAYER){
                [spriteA contactWithPlayer:(Player*)spriteB];
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:2)

在您的联系人监听器的BeginContact回调中,您可以执行contact-&gt; SetEnabled(false)来禁用正常的碰撞响应,并让玩家通过包,就好像它不在那里一样。

但这根本不会让玩家放慢速度。你需要添加一点自己的冲动来让玩家慢一点(与运动方向相反的一些冲动应该这样做)。