box2d итерации - PullRequest
       7

box2d итерации

0 голосов
/ 23 марта 2011

Привет, я программирую для iphone с использованием каркасов box2d и cocos2d.

В настоящее время у меня есть 3 класса всех подклассов CCSprite.
Это: DynamicBlock1, DynamicBlock2 и DynamicEgg1

В основном моя проблема заключается в том, что я хочу разделить итерации в методе tick, чтобы я мог выполнять итерации определенных классов, а не других.

В настоящее время метод Tick (итерация) разделен на две части, isMoving == YES / NO .. Это переключает итерацию между b2body (Master) -sprite (Slave) и b2body (Slave) -sprite (Master). Таким образом, я могу делегировать, кто кого контролирует. И это работает довольно хорошо.

Еще раз, проблема в том, что этот код, приведенный ниже, будет перебирать ВСЕ мои тела из всех моих классов в GetBodyList (). Когда я просто хочу, чтобы итерация происходила с одним классом (DynamicBlock1) ...

Есть ли способ сделать это? Чтобы выделить итерации?

Тысяча благодарностей
Оливер

-(void) tick:(ccTime)dt
{
int32 velocityIterations = 8;
int32 positionIterations = 1;
world->Step(dt, velocityIterations, positionIterations);

for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
    DynamicBlock1 *block1 = (DynamicBlock1*)b->GetUserData();
            if (block1.isMoving == NO){
                    block1.position = CGPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
                    block1.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
            }
            if (block1.isMoving == YES){
                    b2Vec2 b2Position = b2Vec2(block1.position.x/PTM_RATIO, block1.position.y/PTM_RATIO);
                    float32 b2Angle = -1 * CC_DEGREES_TO_RADIANS(block1.rotation);
                    b->SetTransform(b2Position,b2Angle);
            }
    }
}

1 Ответ

1 голос
/ 24 марта 2011

Если вы хотите разделить итерации, вы должны сами поддерживать отдельные списки (или массивы) для разных классов. И всякий раз, когда вы создаете тело, вы можете добавить ссылку на это тело в соответствующих списках. Например, у вас есть списки типа

NSArray * DynamicBlocksList; NSArray * DynamicEgssList;

Теперь, когда вы создаете тело DynamicBlock, вы также добавляете его в «DynamicBlocksList», и когда это тело уничтожается, вы можете удалить его из списка. А в функции Tick () вы можете перебирать только требуемый список.

Но, по моему личному мнению, это может быть не очень хорошей идеей для этого. Можно перебирать world-> GetBodyList (), и тогда вы можете делегировать обработку разных тел различным классам или функциям.

...