iphone cocos2d исчезают спрайты - PullRequest
       19

iphone cocos2d исчезают спрайты

1 голос
/ 20 сентября 2009

Я работаю над игрой и реализую физику с помощью бурундука. Все шло хорошо на части cocos2d до интеграции с бурундуком. Немного фона:

Игра представляет собой игру с блоками. Уровни определяются в списке свойств, где позиции, размеры блоков, гравитационные силы и т. Д. Определяются для каждого блока, отображаемого на уровне.

Проблема в том, что блоки появляются. У меня есть метод в классе BlockLayer, который является частью основной сцены моей игры. После создания слоя список свойств читается, и все блоки создаются. Для создания блоков вызывается следующий метод:

- (void)createBlock:(Block*)block withAssets:(NSBundle*)assets
{
    Sprite* sprite;
    switch(block.blockColour)
    {
        case kBlockColourGreen:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@"green" ofType:@"png" inDirectory:@"Blocks"]];
            break;
        case kBlockColourOrange:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@"orange" ofType:@"png" inDirectory:@"Blocks"]];
            break;
        case kBlockColourRed:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@"red" ofType:@"png" inDirectory:@"Blocks"]];
            break;
        case kBlockColourBlue:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@"blue" ofType:@"png" inDirectory:@"Blocks"]];
            break;
    }
    sprite.position = block.bounds.origin;
    [self addChild:sprite];
    if(block.blockColour == kBlockColourGreen || block.blockColour == kBlockColourRed)
        space->gravity = cpvmult(cpv(0, 10), 1000);
    cpVect verts[] = {
        cpv(-block.bounds.size.width, -block.bounds.size.height),
        cpv(-block.bounds.size.width, block.bounds.size.height),
        cpv(block.bounds.size.width, block.bounds.size.height),
        cpv(block.bounds.size.width, -block.bounds.size.height)
    };
    cpBody* blockBody = cpBodyNew([block.mass floatValue], INFINITY);
    blockBody->p = cpv(block.bounds.origin.x, block.bounds.origin.y);
    blockBody->v = cpvzero;
    cpSpaceAddBody(space, blockBody);
    cpShape* blockShape = cpPolyShapeNew(blockBody, 4, verts, cpvzero);
    blockShape->e = 0.9f;
    blockShape->u = 0.9f;
    blockShape->data = sprite;
    cpSpaceAddShape(space, blockShape);
}

При использовании приведенного выше кода спрайты никогда не появляются. Однако, если я закомментирую «cpSpaceAddBody (space, blockBody);» линия, спрайты появляются.

Положение и размер блоков хранятся в свойстве "bounds" экземпляров класса Block, которое является CGRect.

Не уверен, что это важно, но ориентация приложения находится в левом горизонтальном положении, и все координаты основаны на этой ориентации.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2009

Хорошо, так что я нашел ответ. Проблема была верить или нет, с гравитацией при настройке бурундука. Я неправильно его настраивал, устанавливая гравитацию на cpv (0,0), чтобы мои блоки отображались на экране Затем, немного поработав с другим кодом, я снова смог ввести гравитацию. Просто пришлось поиграть в моем методе создания блока.

0 голосов
/ 31 марта 2010

Могу ли я просто спросить, как вы рассчитываете массу вашего блока (ов)?

cpBody* blockBody = cpBodyNew([block.mass floatValue], INFINITY);
0 голосов
/ 20 сентября 2009

Убедитесь, что никакие конкретные тела не перекрываются Если два тела перекрываются, алгоритм вычисления силы становится немного сумасшедшим, и в итоге вы получаете два тела, которые находятся вне координат экрана.

Как говорится, verts array кажется неправильным:

cpVect verts[] = {
    cpv(-block.bounds.size.width, -block.bounds.size.height),
    cpv(-block.bounds.size.width, block.bounds.size.height),
    cpv(block.bounds.size.width, block.bounds.size.height),
    cpv(block.bounds.size.width, -block.bounds.size.height)
};

Вы должны работать с половинами заданных значений, начиная с: |x| + |-x| = 2x. (а ты хочешь только 1x)

cpVect verts[] = {
    cpv(-(block.bounds.size.width/2), -(block.bounds.size.height/2)),
    cpv(-(block.bounds.size.width/2), block.bounds.size.height/2),
    cpv(block.bounds.size.width/2, block.bounds.size.height/2),
    cpv(block.bounds.size.width/2, -(block.bounds.size.height/2))
};
...