O verdadeiro truque disso é a ciência no ensino médio; o que você deveria ter feito. Caso você não tenha feito uma pesquisa rápida no Google, você começará . Para explicar como você evita a mentalidade de 'iniciante', veja o exemplo do módulo lunar .
Depois de ler [change in position] = [velocity] * [time passed]
, fica claro que seria necessário acompanhar essas variáveis:
float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.
Depois disso, você simplesmente aplicaria a velocidade à posição de cada quadro:
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;
Agora, gostaríamos de alterar a velocidade de cada quadro para adicionarmos a gravidade. De acordo com a mesma fonte exata [change in velocity] = [acceleration] * [time passed]
. Portanto, podemos aplicar exatamente o mesmo princípio:
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;
Agora você precisa de uma maneira para o jogador controlar sua nave espacial. Ao ler mais sobre física básica, você aprenderá que o movimento é o resultado da força - não consigo encontrar uma fonte, mas [change in acceleration] = ([force] / [mass]) * time
(pelo que me lembro). Portanto, quando o jogador pressiona uma tecla, basta definir as variáveis fx
e fy
para algo e aplicar a equação durante a atualização.
Por fim, você precisa pensar sobre a física em torno dos objetos em seu jogo - e, em vez de tentar fazê-los se mover da maneira que você pensaria, procure a equação .
Nota futura: Lembre - se de que essa definitivamente não é a melhor maneira de fazer física (isso é chamado de Integração de Euler e pode levar a alguns cenários estranhos a taxas de quadros baixas) - você precisa procurar outras maneiras de fazer as coisas (esse artigo tem bastante boa redação sobre o básico básico). No entanto, fique com a Integração Euler por enquanto, pois significa que você está tentando aprender uma coisa menos.
Quais jogos o ensinariam a pensar na mentalidade correta?
Como você testaria se fez as coisas corretamente e com a mentalidade correta? Insira um Sleep(10 milliseconds)
no loop do jogo e tudo ainda deve se mover e reagir da mesma maneira que a taxa de quadros completa.
Por fim, mantenha-se afastado do 3D (e, portanto, Quaternions e Matrizes) até ter uma boa experiência em fazer jogos 2D funcionarem. Atrevo-me a dizer que alguns desenvolvedores de jogos não sabem realmente como Quaternions ou Matrices funcionam - mas apenas sabem como usá-los - os abordam muito mais tarde (ou nunca, jogos 2D são muito divertidos e podem ser bastante bem sucedido). Você realmente não precisa conhecer álgebra linear e assim por diante para fazer isso no nível básico (mas isso realmente ajuda, então vá a algumas aulas noturnas, se puder).
Bônus final: Uma coisa que meu professor de arte sempre me disse é "não desenhe o que acha que vê, desenhe o que vê". O mesmo se aplica aqui "não modele o que você acha que acontece ( object.position++
), modele o que acontece (` object.position + = velocity * time) "- pelo menos até limites razoáveis (você não está modelando um sistema perfeitamente preciso, mas faça algo que é uma boa imitação).