Игра Iphone 2d - применение гравитации, отказов - PullRequest
2 голосов
/ 30 мая 2011

В настоящее время я являюсь разработчиком флеш-игр. Я начал писать игры для iphone, используя движок cocos 2d. Я реализовал отдельную теорему Axis для обнаружения столкновений, которая работает отлично. Все полигоны нарисованы следующим образом в openGl. Теперь я пытаюсь применить гравитацию к этому блоку 16x16 после многих поисков. Я нашел этот урок http://www.seinia.com/tutorials/Bounce/ и реализовал то же самое в цели C.

Проблема в том, что после того, как квадрат останавливается, он продолжает подпрыгивать вверх / вниз в долях. Я много пытался это исправить, но я не мог контролировать это крошечное движение. У меня никогда не было такой проблемы во вспышке, но здесь плавающее значение сильно влияет на положение квадрата.

Пожалуйста, дайте мне знать, как написать такую ​​проблему, любой ссылочный URL будет полезен. Ценим вашу помощь. Спасибо!

0,16        16,16 

 ------------
|            |
|            |
|            |
|            |       
 ------------

0,0          16,0

Объективный код C

if (square.points[0].y <= 0.1f) {
        velocity.vy *= -bounce;
        [square restInPeace:[Vector2D createVectorWithComponentX:velocity.vx Y:8.0f]];
        // landed
        if (fabs(velocity.vy) < 0.9f) {
            velocity.vy = 0.0f;
            [square restInPeace:[Vector2D createVectorWithComponentX:velocity.vx Y:8.0f]];
            isLanded = YES;
        }   
    } 

Перевести объект

-(void) translateVelocity:(Vector2D*)velocity
{   
    // The center as well as all of the vertices need to be
    // accommodated.
    center.x += velocity.vx;
    center.y += velocity.vy;

    for(int i=0; i < count; i++)
    {
        points[i].x += velocity.vx;
        points[i].y += velocity.vy;

        ////NSLog(@"velocity %f %f",points[i].x , points[i].y);
    }
}

1 Ответ

2 голосов
/ 30 мая 2011

При использовании алгоритма отказов обычно рекомендуется реализовать небольшое несовершенство, чтобы избежать возникновения этого события. Вы также можете увеличить диапазон того, что принято называть «приземлился», но не забудьте прикрепить объект к полу, чтобы убедиться в отсутствии визуальных артефактов.

Под несовершенством я подразумеваю:

velocity.vy *= (-bounce + 0.01f);

Например. Это должно заставить ваш объект всегда останавливаться.

...