2D Теория Движения - PullRequest
       11

2D Теория Движения

2 голосов
/ 06 ноября 2010

Недавно я попал в OpenGL / SDL и поиграл с объектами в 2D / 3D пространстве, и, как я уверен, у большинства новичков в этой области есть несколько вопросов о «лучшем» способе сделать что-то. Я цитирую лучше всего, потому что я предполагаю, что нет лучшего способа, это личное предпочтение.

Итак, у меня есть сущность, простая GL_QUAD, которую я хочу перемещать. У меня есть настройка событий клавиатуры, я могу получить события нажатия / отпускания, не проблема.

У меня есть класс сущности, который является моей псевдо-реализацией GL_QUAD ....

class Entity
{
    void SetVelocity(float x, float y);
}

У меня есть этот код обработчика событий ...

if theEvent.Key = UPARROW AND theEvent.State = PRESSED
    Entity.SetVelocity(0.0f, -1.0f);
else if theEvent.Key = UPARROW AND theEvent.State = RELEASED
    Entity.SetVelocity(0.0f, 0.0f);

Мой вопрос: это лучший способ переместить мою сущность? Это привело меня к мысли, что мы могли бы сделать это немного сложнее, если бы у нас был отдельный метод регулировки скорости X / Y. Как SetVelocity забудет меня скорость X, если я начну двигаться влево? Так что я никогда не смогу путешествовать по диагонали.

Например ...

class Entity
{
    void SetXVelocity(float x);
    void SetYVelocity(float y);
}

if theEvent.Key = UPARROW AND theEvent.State = PRESSED
    Entity.SetYVelocity(-1.0f);
else if theEvent.Key = UPARROW AND theEvent.State = RELEASED
    Entity.SetYVelocity(0.0f);
if theEvent.Key = LEFTARROW AND theEvent.State = PRESSED
    Entity.SetXVelocity(-1.0f);
else if theEvent.Key = LEFTARROW AND theEvent.State = RELEASED
    Entity.SetXVelocity(0.0f);

Таким образом, если у меня есть XVelocity, и я затем нажимаю Вверх, у меня все еще будет моя XVelocity, а также новая YVelocity, таким образом, перемещающаяся по диагонали.

Есть ли лучший способ? Я что-то упускаю здесь очень просто?

Я использую SDL 1.2, OpenGL, C ++. Не уверен, что в SDL / OpenGL есть что-то, что могло бы помочь?

Заранее спасибо за ваши ответы.

Ответы [ 4 ]

3 голосов
/ 06 ноября 2010

Вопрос действительно общий, поскольку он зависит от того, как вы хотите смоделировать движение ваших объектов в вашем мире.

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

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

2 голосов
/ 06 ноября 2010
Ускорение

применяется в течение определенного периода времени, поэтому в примере @jack вы бы применили ускорение 10 м / с ^ 2 в течение периода времени в одну секунду.

вы также должны изменить свое приложение, чтобы оно основывалось на времени , а не на фреймах.

посмотрите на это базовое введение в физику игры ,и я бы тоже взглянул на GameDev.net Учебники по физике

0 голосов
/ 06 ноября 2010

Хорошо, вы описываете простой конечный автомат .У вас есть разные направления, в которых вы можете двигаться (плюс вообще не двигаться) как состояния, а ключевые события - как переходы.Обычно это может быть реализовано довольно хорошо, используя шаблон состояния , но это часто бывает довольно болезненно в C ++ (много шаблонного кода) и может оказаться чрезмерным для вашего сценария.Это, конечно, другие способы представления скорости и направления вашей сущности, например, в виде 2D-вектора (где длина дает скорость).Это позволит вам легко представлять произвольные направления и скорости.

0 голосов
/ 06 ноября 2010

Я предполагаю, что вы хотите, чтобы движение работало, чтобы игрок двигался только тогда, когда нажата клавиша.Короче говоря, ваше решение в порядке.

Некоторые потенциальные ошибки, которые следует учитывать: Что произойдет, если нажать и левую и правую?

...