box2d итерации

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

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

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

В настоящее время метод 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);
            }
    }
}

person Ospho    schedule 23.03.2011    source источник


Ответы (1)


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

NSArray *DynamicBlocksList; NSArray *DynamicEgssList;

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

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

person Tayyab    schedule 24.03.2011
comment
Спасибо, примерно так и решил сделать. - person Ospho; 24.03.2011