2016-10-30 5 views
0

Я делаю платформерную игру. Прыжки и движение работают, и теперь я хочу запрограммировать столкновения. У меня есть какая-то идея относительно того, как это будет работать:Расчет столкновений с учетом скорости

Я не был уверен, должен ли этот вопрос находиться здесь или в игровом сайте dev.

  1. У меня есть два Vector2 в - Вело и импульс (Velo является скорость). Оба значения (0, 0). Импульс - это то, что добавляется к скорости каждого кадра.

  2. Каждый кадр, я сначала получаю вход. Импульс увеличивается и/или увеличивается на основе нажатых клавиш (например: if (Gdx.input.isKeyPressed(Keys.A)) { momentum.x -= speed; })

  3. Затем я умножаю импульс на 0,15. Это так, что оно замедляется.

  4. После этого умножаю скорость на 0,8.

  5. Затем я добавить импульс скорости, чтобы увеличить скорость, так как это то, что на самом деле перемещает игрока.

  6. Затем я добавляю скорость в положение плеера.

  7. Чтобы применить гравитацию, я добавляю вектор силы тяжести (0, -10) в положение плеера.

Поэтому мне нужно найти способ перемещения плеера, но не позволять ему перекрывать любую часть мира. Мир состоит из множества Rectangle экземпляров. Тело игрока также является экземпляром Rectangle. Было бы проще переписать столкновения с помощью Box2D? То, что я пробовал, проверяет, перекрывает ли игрок какие-либо прямоугольники при его перемещении, и если это произойдет, а не перемещение.
Но это, кажется, не учитывает все - иногда это работает, но в других случаях оно останавливается, прежде чем прикасаться к миру.

TL; Я хочу совершить столкновение моего игрока с миром, который хранится в виде сетки прямоугольников. Как мне это сделать, поскольку мой игрок также является прямоугольником. Было бы проще использовать Box2D?

+1

Я бы перевел это на сайт разработки игр. Я бы также рекомендовал изучать некоторые физики. – duffymo

+0

@duffymo Как перенести его на сайт игры dev? И, я уверен, я знаю достаточно физики для этого, бут, может быть, не –

+0

Я бы сказал, что нет после прочтения вашего вопроса. – duffymo

ответ

0

Этот ответ дает хороший обзор о деталях обнаружения столкновения: https://gamedev.stackexchange.com/a/26506

Однако, это может быть немного подавляющим, если вы просто хотите, чтобы получить простую игру собирается. Происходит ли ваш цикл игры в фиксированном интервале или зависит от частоты кадров? Возможно, вы могли бы решить часть своей проблемы, просто разделив обнаружение столкновения на несколько шагов. Вместо того, чтобы полностью перемещаться во время одного обновления, вы можете сделать 10 небольших обновлений, каждый из которых перемещает вас только на 10-е расстояние. Затем вы выполняете проверку на столкновение после каждого шага, поэтому вероятность того, что вы остановитесь слишком рано или переместитесь через тонкие объекты, будет менее вероятно.

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

EDIT: Просто оберните обновление положения в цикле for.Я не знаю, как ваш код для проверки и обновления столкновений, но общая структура была бы чем-то вроде

for (int i = 0; i < 10; i++) { 
    newPosX += deltaX * 0.1; // 1/10th of the usual update 
    newPosY += deltaY * 0.1; // 1/10th of the usual update 
    if (checkCollision(newPosX, newPosY)) 
    { 
     posX = newPosX; 
     posY = newPosY; 
    } 
    else 
    { 
     break; // We hit something, no more mini-updates necessary. 
    } 
} 
+0

Как я могу сделать 10 небольших обновлений? На данный момент я просто перемещаю персонажа в каждый кадр. –