Физика, поворачивай как машина

Мне трудно заставить физический движок Бурундука делать то, что я хочу. Единственное решение, которое, кажется, работает, требует некоторой тяжелой векторной математики. Прежде чем окунуться в эту кроличью нору для других компонентов моей игры, я надеялся, что кто-нибудь сможет подсказать мне лучший способ сделать это. Желаемый игровой процесс выглядит следующим образом:

  • Персонаж движется вокруг конечного пространства в виде сверху вниз
  • Движение всегда с постоянной скоростью в любом направлении, перед которым стоит персонаж
  • Игрок стучит по экрану, что заставляет персонажа "поворачиваться" к месту, к которому он прикоснулся

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

2 ответа

Решение

Это учебное пособие о том, как создавать элементы управления сверху вниз с помощью специально настроенных соединений: http://chipmunk-physics.net/tutorials/ChipmunkTileDemo/

Он основан на Chipmunk Pro, но материал об управлении персонажем легко адаптируется к ванильному бурундуку. Демонстрация "Tank", которая поставляется с не-Pro источником Chipmunk, реализует почти то же самое, если вы хотите увидеть некоторый C-код для него.

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

Таким образом, вы должны сохранить местоположение и ориентацию игрока (координаты X, Y и Фи). И чтобы определить, стоит ли останавливаться, вы можете сделать что-то вроде этого:

dx = playerx - tapx;
dy = playery - tapy;
targetAngle = atan2(dy,dx);
if (phi > targetAngle)
    {
    if (phi - targetAngle > PI) omega = rotate;
    else omega = -rotate;
    }
else if (phi < targetAngle)
    {
    if (targetAngle - phi > PI) omega = -rotate;
    else omega = rotate;
    }
else omega = 0;
Другие вопросы по тегам