gpt4 book ai didi

c++ - Box2D:程序在破坏 b2Body 时崩溃

转载 作者:行者123 更新时间:2023-11-30 04:11:42 25 4
gpt4 key购买 nike

我正在学习使用 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->下一个

最佳答案

您在 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

关于c++ - Box2D:程序在破坏 b2Body 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20132789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com