2

シマリスの体を削除する正しい方法は何ですか? cpBodyFreeorを呼び出すだけで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);   ??
}
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

形状が静的として追加されているかどうかを確認する必要があります。次のコードが少し役立つ場合があります。

    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 に答える
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 に答える