我正在学习box2D的冲突检测和回调。我正在尝试实现一个非常简单的方法,但是我的程序崩溃了。我想破坏b2Body* Drop_object与另一个Body碰撞之后。

这是我创建它的方式:

b2Body* addDropObj(int x,int y,int w,int h,bool dyn=true)
{
b2BodyDef bodydef;
bodydef.position.Set(x*P2M,y*P2M);   //Setting body position
if(dyn)
{
        bodydef.type=b2_dynamicBody;  // dynamic body means body will move

}

Drop_object=world->CreateBody(&bodydef);        //Creating box2D body

b2PolygonShape shape;            //Creating shape object
shape.SetAsBox(P2M*w,P2M*h);


dropFixture.shape=&shape;
dropFixture.density=1.0;
dropFixture.restitution = 0.7;
Drop_object->CreateFixture(&dropFixture);
return Drop_object;
}

调用Timer函数:
    void Timer(int t)
    {

   if (mCounter == 0)
   {
            // rand() % 100 - random value in range 0 - 99
        addBrick(rand() % 100 + 100, 0,10,10);

        mCounter = rand() % MAX_DELAY;
    }
    mCounter--;

        world->Step(1.0/30.0,8,3);

        glutPostRedisplay();
        glutTimerFunc(1000/30,Timer,1);

    }

display函数中销毁
if(hide)                 //hide is a global boolean variable initialized to false
{
world->DestroyBody(Drop_object);
hide = false;
}

最后是Begincontact函数:
    void Callback::BeginContact(b2Contact* contact)
    {


    std::cout << "Begin Contact" << std::endl;

    b2Body* bodyA = contact->GetFixtureA()->GetBody();
    b2Body* bodyB = contact->GetFixtureB()->GetBody();



    if((bodyA == Key_char && bodyB ==  Drop_object) || (bodyA == Drop_object && bodyB     ==  Key_char))
    {

        score++;
        std::cout << score << std::endl;
    }

    hide= true;

}

它带我到指向箭头的b2World DestroyBody方法

je = je-> next

最佳答案

您可以在BeginContact的任何调用中将hide设置为true。我认为,您的意思是:

if((bodyA == Key_char && bodyB ==  Drop_object) || (bodyA == Drop_object && bodyB     ==  Key_char))
{

    score++;
    std::cout << score << std::endl;
    hide= true;
}

并且,作为推荐:
world->DestroyBody(Drop_object);
Drop_object = nullptr; // To avoid future errors

发表评论:我认为某些物体在碰撞后不会消失,因为您对所有生成的物体都使用了一个变量。建议下一个顺序:
1) Drop_object=world->CreateBody(&bodydef);
2) Drop_object=world->CreateBody(&bodydef); // First object still falling
3) world->DestroyBody(Drop_object); // Second object contacted, and destoryed
// First object will never be destroyed

09-06 23:03