【问题标题】:Chipmunk: how to delete a body?花栗鼠:如何删除身体?
【发布时间】:2010-02-12 22:31:05
【问题描述】:

删除花栗鼠身体的正确方法是什么?简单地调用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);   ??
}

【问题讨论】:

  • 好吧,对于从未听说过你在说什么的人来说,这是一个奇怪的问题开始。
  • 令人惊讶的是,这一次它不是 Ruby 库
  • @mmyers,在您指出之前,它看起来并不奇怪。还好它不是名为 My Coworkers 的包!

标签: oop chipmunk


【解决方案1】:

删除正文的方法如下:

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

【讨论】:

  • 好的,但如果你不再需要它,你只会删除空间,对吧?如果您有其他花栗鼠身体,您需要保留空间,对吗?
  • 好的,我试图从静态 cpBool begin 或 preSolve 花栗鼠方法中调用一个方法。我放了这个,但它当然没有用,因为它不是 c++ 代码,而是 objC。 [自我移除盾牌:盾牌];我将如何用 C++ 编写它?
【解决方案2】:

查看lib code后

void cpBodyDestroy(cpBody *body){}

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多