Мысли? Или это совершенно неверное направление?
Это неправильное направление.
На самом деле, идея возможности ставить в очередь действия или приказы имеет некоторую ценность. Но обычно это относится к таким вещам, как ИИ и к более общим задачам (например, «перейти к локации Х», «атаковать все, что вы видите» и т. Д.). Так что, как правило, она не охватывает проблему покадрового перемещения, с которой вы здесь сталкиваетесь.
Для очень простых объектов, таких как пули, задачи очередей довольно излишни. В конце концов, что еще будет делать пуля, кроме как двигаться вперед каждый раз? Это также неловкий способ реализовать такое простое движение. Это поднимает такие вопросы, как, почему только 400 шагов вперед? Что если площадь впереди длиннее? Что делать, если оно короче? Что, если какой-то другой объект будет мешать только после, скажем, 50 шагов? (Тогда 350 ходов в очереди были пустой тратой.)
Другая проблема с этой идеей (по крайней мере, в том упрощенном виде, который вы представили) заключается в том, что ваши пули будут перемещаться на фиксированную величину за каждую итерацию игрового цикла. Но не все итерации будут занимать одинаковое количество времени. Компьютеры некоторых людей, очевидно, смогут выполнять код быстрее, чем другие. И даже игнорируя это, иногда игровой цикл может выполнять значительно больше работы, чем в другое время (например, когда в игре активно больше объектов). Таким образом, вам действительно нужен способ учета времени, которое занимает каждая итерация, чтобы отрегулировать движение и чтобы все казалось движущимся с постоянной скоростью для пользователя, независимо от того, насколько быстро проходит игровой цикл.
Таким образом, вместо того, чтобы каждое действие перемещения было «ходом на X», они были бы «двигаться на скорости X», а затем умножались бы на что-то вроде времени, прошедшего с последней итерации. И тогда вы действительно никогда не узнаете, сколько действий перемещается в очередь, потому что это будет зависеть от того, насколько быстро ваш игровой цикл выполняется в этом сценарии. Но опять же, это еще один признак того, что действия по перемещению в очереди являются неудобным решением для покадрового движения.
То, как большинство игровых движков делает это, это просто вызывает какую-то функцию на каждом объекте каждого кадра, которая оценивает его движение. Может быть, такая функция, как void ApplyMovement(float timeElapsedSinceLastFrame);
. В случае пули она умножит скорость, с которой пуля должна двигаться в секунду, на время, прошедшее с последнего кадра, чтобы определить величину, по которой пуля должна двигаться в этом кадре. Для более сложных объектов вы можете захотеть сделать математику с вращениями, ускорениями, замедлениями, поиском цели и т. Д. Но общая идея та же: вызывайте функцию на каждой итерации игрового цикла, чтобы оценить, что должно произойти для этой итерации.