Физика, поворачивай как машина
Мне трудно заставить физический движок Бурундука делать то, что я хочу. Единственное решение, которое, кажется, работает, требует некоторой тяжелой векторной математики. Прежде чем окунуться в эту кроличью нору для других компонентов моей игры, я надеялся, что кто-нибудь сможет подсказать мне лучший способ сделать это. Желаемый игровой процесс выглядит следующим образом:
- Персонаж движется вокруг конечного пространства в виде сверху вниз
- Движение всегда с постоянной скоростью в любом направлении, перед которым стоит персонаж
- Игрок стучит по экрану, что заставляет персонажа "поворачиваться" к месту, к которому он прикоснулся
Основная идея похожа на вождение автомобиля. Вы не можете немедленно развернуться, но вместо этого должны сначала выполнить разворот. Эта машина также должна поддерживать постоянную скорость. Как я могу это сделать? Бонусный вопрос: как вы можете переопределить любой метод, который бурундук вызывает, чтобы обновить положение тела, и это хорошая идея?
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;