Бурундук: как удалить тело? - PullRequest
2 голосов
/ 13 февраля 2010

Как правильно удалить тело Бурундука? Кажется, что простой вызов 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);   ??
}

Ответы [ 3 ]

4 голосов
/ 14 февраля 2010

Вот как удалить тело:

  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);
    }
    
0 голосов
/ 03 июля 2014

Вы должны убедиться, что форма была добавлена ​​как статическая или нет, может быть, этот код немного поможет:

    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;
    }
0 голосов
/ 13 февраля 2010

После просмотра кода lib

void cpBodyDestroy(cpBody *body){}

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

Звоните cpBodyFree (внутренне вызывает cpBodyDestroy.

ОБНОВЛЕНИЕ: За исключением случаев, когда вам не нужна проверка и вызов cpfree(body); ) * +1010 *

...