Установка постоянной и увеличение скорости для спрайта в box2d

Я пытаюсь создать 3 разных уровня сложности (легкий, средний и сложный) для игры, которую пытаюсь разработать. Я использую флаг, чтобы различать 3 (легкий = 1, средний = 2, жесткий = 3). Теперь я пытаюсь выяснить, как установить скорость для легкой и постоянной, затем увеличить ее после 20 столкновений при средней скорости, а затем увеличить после 10, когда выбран жесткий режим. Вот как я пытаюсь это реализовать:

-(id)init)
{vel = 8;
counter = 0;}

-(void)update:(ccTime)dt{
_world->Step(dt, vel, 10);

for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
if((contact.fixtureA == _paddleFixture && contact.fixtureB == _ballFixture) || (contact.fixtureA == _ballFixture && contact.fixtureB == _paddleFixture))
{
counter++;
[self updateSpeed];
}
}

-(void)updateSpeed{
if(diffLevel == 2)
{
if(counter%20 == 0)
{
vel = vel + 5;
}
}
else if(diffLevel == 3)
{
if(counter%10 == 0)
{
vel = vel + 10;
}
}
else
{
vel = 8;
}}

Счетчик работает, но скорость не увеличивается, когда счетчик делится на 20 или 10, и я не могу получить постоянную скорость для легкого уровня. Он начинается довольно быстро, затем постепенно замедляется. Что я здесь не так делаю? Пожалуйста помоги.

0

Решение

Кто-то предложил мне это, и это работает, поэтому я просто опубликую это на тот случай, если кому-то еще это понадобится:

- (void)update:(ccTime) dt {
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
if(sprite.tag == 2)
{
int maxSpeed = 140;

b2Vec2 dir = b->GetLinearVelocity();
dir.Normalize();

float currentSpeed = dir.Length();
float accelerate = vel;

if(currentSpeed < maxSpeed)
{
b->SetLinearVelocity(accelerate * dir);
}

sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}}}

Это единственная часть моего кода, в которую я внес изменения. Я позволил методу updateSpeed ​​выполнять вычисления для увеличения и установки максимальной скорости мяча

0

Другие решения

Других решений пока нет …