Многие игры не используют многопоточность.Они используют игровой цикл, который выглядит следующим образом
while (gameIsRunning) {
ProcessInputs();
UpdateGameWorld();
GenerateOutputs();
}
Вы должны хранить состояние каждого объекта (аватары, космические корабли, бомбы ...).В соответствии с пользовательскими вводами и текущим игровым временем UpdateGameWorld
обновляет состояние каждого объекта.Состояние включает в себя позиции, скорости, жизненно важные функции, энергию, время жизни и т. Д.
Затем GenerateOutputs
использует эту обновленную информацию о состоянии для генерации выходных данных.
Со времениего выполнение одного цикла может варьироваться, лучше всего посмотреть, сколько времени прошло с момента последнего цикла, используя StopWatch
.Скорости и позиции рассчитываются следующим образом:
newSpeed = speed + delta_time * acceleration
position = position + delta_time * 0.5 * (speed + newSpeed)
speed = newSpeed
Здесь ускорение, скорость и положение - это векторы (2D или 3D в зависимости от типа игры).
Ускорение определяется гравитацией,сопротивление, тяга, газ, разрывы и т. д.