Настоящий трюк с этим - наука на уровне средней школы; что вы должны были сделать. В том случае, если вы не быстрый поиск Google поможет вам начали . Чтобы объяснить, как вы избегаете «новичка», возьмите пример с лунного корабля .
После прочтения [change in position] = [velocity] * [time passed]
становится ясно, что необходимо отслеживать эти переменные:
float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.
После этого вы просто примените скорость к позиции каждого кадра:
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;
Теперь мы хотели бы изменить скорость каждого кадра, чтобы добавить гравитацию. По точно такому же источнику [change in velocity] = [acceleration] * [time passed]
. Поэтому мы можем применить тот же принцип:
const float gravity = 9.8f; // The gravity of the earth.
// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;
Теперь вам нужен способ управлять своим космическим кораблем. Прочитав больше об основной физике, вы узнаете, что движение является результатом силы - я не могу найти источник, но [change in acceleration] = ([force] / [mass]) * time
(насколько я помню). Поэтому , когда игрок нажимает клавишу , которую вы бы просто установить fx
и fy
переменные к чему - то и применить уравнение во время обновления.
В конечном счете, вам нужно подумать о физике вокруг объектов в вашей игре - и вместо того, чтобы пытаться заставить их двигаться так, как вы думаете, лучше взгляните на уравнение .
Примечание на будущее: помните, что это определенно не лучший способ заниматься физикой (это называется интеграцией Эйлера и может привести к некоторым странным сценариям с низкой частотой кадров) - вам нужно искать другие способы ведения дел (в этой статье довольно хорошая запись на голые основы, а). Однако пока придерживайтесь Euler Integration, поскольку это означает, что вы пытаетесь научиться чему-то меньшему.
Какие игры научат вас правильно мыслить?
Как бы вы проверили, что вы сделали все правильно и с правильным мышлением? Вставьте Sleep(10 milliseconds)
в свой игровой цикл, и все должно двигаться и реагировать так же, как и полная частота кадров.
Наконец, пожалуйста, держитесь подальше от 3D (и, следовательно, кватернионов и матриц), пока у вас не будет достаточного опыта в создании 2D-игр. Рискну сказать, что довольно много разработчиков игр на самом деле не знают, как работают Quaternions или Matrices, - а просто знают, как их использовать, - подойти к ним гораздо позже (или никогда, 2D-игры - это очень весело и может быть довольно успешно). Вам действительно не нужно знать линейную алгебру и так далее, чтобы делать это на базовом уровне (но это действительно помогает, поэтому, если можете, сходите на вечерние занятия).
Финальный бонус: одна вещь, которую мой учитель рисования всегда говорил мне: «Не рисуй то, что, как ты думаешь, ты видишь, рисуй то, что ты видишь». Здесь применимо то же самое: «не моделируйте то, что, по вашему мнению, происходит ( object.position++
), моделируйте то, что происходит (` object.position + = скорость * время) "- по крайней мере, в разумных пределах (вы не моделируете совершенно точную систему, но что-то хорошее подражание).