Oop 花栗鼠:如何删除身体?

Oop 花栗鼠:如何删除身体?,oop,chipmunk,Oop,Chipmunk,删除花栗鼠尸体的正确方法是什么?简单地调用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 */ cpBodyFre

删除花栗鼠尸体的正确方法是什么?简单地调用
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);   ??
}
if(body->p.y<-260 | | fabsf(body->p.x)>340){
/*身体永远离开屏幕*/
/*所以它需要被永久删除*/
cpBodyFree(body)??
cpBodyDestroy(body)??
}
查看

调用
cpBodyFree
(它在内部调用cpBodyDestroy


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

以下是删除body的方法:

  • 如果存在与实体关联的形状,请从空间中删除该形状并将其删除
  • 从空间中移除主体(这是我丢失的部分。)
  • 最后,删除不再需要的空间
  • 下面是如何使Plink演示雨滴落下一个五边形阵雨,并在下雨时将其清理干净 他们离开了屏幕

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

    body->data=shape;
    
  • 从空间中移除形状和主体,然后释放形状和主体。没有 如果你先移除/释放形状还是先释放身体似乎很重要,只要你 请记住,释放身体时,形状的指针将丢失。将每个车身的功能更改为:

    if (body->p.y < -260 ) {
        cpSpaceRemoveShape(space, body->data);
        cpSpaceRemoveBody(space, body);
        cpShapeFree(body->data);
        cpBodyFree(body);
    }
    
    if(正文->年度<-260){
    cpSpaceRemoveShape(空间、主体->数据);
    cpSpaceRemoveBody(空间、主体);
    cpShapeFree(主体->数据);
    cpBodyFree(body);
    }
    

  • 您必须确保形状是否已添加为静态,可能以下代码会有所帮助:

        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;
        }
    

    好吧,对于一个从未听说过你在说什么的人来说,这是一个奇怪的问题的开始。令人惊讶的是,这不是一个Ruby库time@mmyers,在你指出之前,它看起来并不奇怪。幸好这不是一个叫“我的同事”的包裹!好的,但是如果你不再需要它,你只会删除这个空间,对吗?如果你有其他花栗鼠的身体,你需要保持空间,对吗?好的,我试着从静态cpBool begin或preSolve花栗鼠方法中调用一个方法。我把它放在了,但当然它不起作用,因为它不是C++代码而是Objc。[自我改造屏蔽:屏蔽];如何在C++中编写?
        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;
        }