删除花栗鼠身体的正确方法是什么?简单地调用cpBodyFree
或cpBodyDestroy
似乎不起作用,因为正文仍显示在cpSpaceEachBody
次迭代中。
if(body->p.y < -260 || fabsf(body->p.x) > 340) {
/* body is permanently off the screen */
/* so it needs to be permanently deleted */
cpBodyFree(body); ??
cpBodyDestroy(body); ??
}
答案 0 :(得分:4)
以下是删除正文的方法:
以下是如何让Plink演示版在一次五角形淋浴中降雨并在清洁时进行清理 他们离开了屏幕。
将此行添加到“//添加大量五边形”循环中。这样我们可以释放附着在身体上的形状。
body->data=shape;
从空间中移除形状和身体,然后释放形状和身体。它没有 如果你首先移除/释放形状或者首先释放形状,只要你这么做似乎很重要 请记住,当你释放身体时,你会失去指向形状的指针。将 eachBody 功能更改为:
if (body->p.y < -260 ) {
cpSpaceRemoveShape(space, body->data);
cpSpaceRemoveBody(space, body);
cpShapeFree(body->data);
cpBodyFree(body);
}
答案 1 :(得分:0)
查看lib code
后void cpBodyDestroy(cpBody *body){}
void
cpBodyFree(cpBody *body)
{
if(body){
cpBodyDestroy(body);
cpfree(body);
}
}
调用cpBodyFree
(它在内部调用cpBodyDestroy。
更新:除非您不需要验证和cpfree(body)
电话; )
答案 2 :(得分:0)
你必须确定形状是否已经添加为静态,可能这段代码会有所帮助:
if(shape != NULL)
{
int isStatic = 1;
cpBody *bd = cpShapeGetBody(shape);
if(bd != NULL)
{
if(!cpBodyIsRogue(bd) && !cpBodyIsStatic(bd)) //second condition is just to make sure
{
isStatic = 0;
cpSpace *sp1 = cpBodyGetSpace(bd);
if(sp1 != NULL)
{
cpSpaceRemoveBody(sp1, bd); //remove body from space and then free it
}
}
cpBodyFree(bd);
}
cpSpace *sp = cpShapeGetSpace(shape);
if(sp != NULL)
{
if(isStatic)
cpSpaceRemoveStaticShape(sp, shape);
else
cpSpaceRemoveShape(sp, shape); //remove shape from space and then free it
}
cpShapeFree(shape);
shape = NULL;
}