2

删除花栗鼠身体的正确方法是什么?简单地调用cpBodyFreeorcpBodyDestroy似乎不起作用,因为主体仍然出现在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);   ??
}
4

3 回答 3

4

以下是删除正文的方法:

  1. 如果有与身体相关联的形状,请从空间中删除该形状并将其删除。
  2. 从空间中取出身体。(这是我缺少的部分。)
  3. 最后,如果不再需要,删除空间。

以下是如何让 Plink 演示像雨点般洒下五边形,并在它们离开屏幕时清理它们。

  1. 将此行添加到“//添加很多五边形”循环中。这样我们就可以释放附着在身体上的形状。

    body->data=shape;
    
  2. 从空间中移除形状和身体,然后释放形状和身体。先移除/释放形状还是先移除实体似乎并不重要,只要记住释放实体时会丢失指向形状的指针。将eachBody函数更改为:

    if (body->p.y < -260 ) {
        cpSpaceRemoveShape(space, body->data);
        cpSpaceRemoveBody(space, body);
        cpShapeFree(body->data);
        cpBodyFree(body);
    }
    
于 2010-02-14T09:00:18.163 回答
0

在查看lib代码后

void cpBodyDestroy(cpBody *body){}

void
cpBodyFree(cpBody *body)
{
    if(body){
        cpBodyDestroy(body);
        cpfree(body);
    }
}

调用cpBodyFree(它在内部调用 cpBodyDestroy。

更新:除非您不需要验证和cpfree(body)调用;)

于 2010-02-12T22:40:38.847 回答
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;
    }
于 2014-07-03T10:51:22.727 回答