El verdadero truco con esto es la ciencia de nivel secundario; que deberías haber hecho. En caso de que no haya realizado una búsqueda rápida en Google, comenzará . Para explicar cómo evitar la mentalidad de "novato", tome el ejemplo del módulo de aterrizaje lunar .
Una vez que haya leído que [change in position] = [velocity] * [time passed]
queda claro que necesitaría realizar un seguimiento de esas variables:
float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.
Después de eso, simplemente aplicaría la velocidad a la posición de cada cuadro:
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;
Ahora nos gustaría alterar la velocidad de cada cuadro para poder agregar gravedad. Según la misma fuente exacta [change in velocity] = [acceleration] * [time passed]
. Por lo tanto, podemos aplicar exactamente el mismo principio:
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;
Ahora necesitas una forma para que el jugador controle su nave espacial. Al leer más sobre física básica, aprenderá que el movimiento es el resultado de la fuerza; no puedo encontrar una fuente, pero [change in acceleration] = ([force] / [mass]) * time
(por lo que recuerdo). Entonces, cuando el jugador presiona una tecla, simplemente establecería las variables fx
y fy
en algo y aplicaría la ecuación durante su actualización.
En última instancia, debes pensar en la física alrededor de los objetos en tu juego, y en lugar de tratar de hacer que se muevan de la manera que pensarías, en lugar de buscar la ecuación .
Nota futura: recuerde que esta definitivamente no es la mejor manera de hacer física (esto se llama Integración de Euler y puede conducir a algunos escenarios extraños a bajas tasas de cuadros): debe buscar otras formas de hacer las cosas (ese artículo tiene bastante buen artículo sobre lo básico también). Sin embargo, quédese con Euler Integration por ahora, ya que significa que está tratando de aprender una cosa menos.
¿Qué juegos te enseñarán a pensar con la mentalidad correcta?
¿Cómo probarías que has hecho las cosas correctamente y con la mentalidad correcta? Inserte un Sleep(10 milliseconds)
en su bucle de juego y todo debería moverse y reaccionar de la misma manera que la velocidad de fotogramas completa.
Finalmente, manténgase alejado de 3D (y aplique Quaternions y Matrices) hasta que tenga una buena experiencia en hacer que los juegos 2D funcionen. Me aventuraría a decir que muchos desarrolladores de juegos en realidad no saben cómo funcionan Quaternions o Matrices, pero simplemente saben cómo usarlos, se acercan a ellos mucho más tarde (o nunca, los juegos 2D son muy divertidos y pueden ser bastante exitoso). Realmente no necesitas saber álgebra lineal y demás para hacer esto en el nivel básico (pero realmente ayuda, así que ve a algunas clases nocturnas si puedes).
Bonificación final: una cosa que mi maestro de arte siempre me dijo es "no dibujes lo que crees que ves, dibuja lo que ves". Lo mismo se aplica aquí "no modeles lo que crees que sucede ( object.position++
), modela lo que sucede (` object.position + = velocity * time) "- al menos a límites razonables (no estás modelando un sistema perfectamente preciso, pero haz algo que es una buena imitación).