Un juego de computadora es un ciclo sin fin de:
- Actualización: avanza el estado del juego una pequeña porción de tiempo (como 1/80 de segundo).
- Pintar el estado actual del juego.
Hay variaciones de estos. Algunos juegos tienen más actualizaciones entre cada pintura, o pueden variar para que el juego fluya igualmente en diferentes máquinas. Pero eso es detalles técnicos.
La fase de actualización que ocurre entre 50 y 100 veces por segundo (sí, es tan frecuente) hace esto:
- Actualiza la física de los juegos. Digamos que un actor tiene una velocidad. La actualización debería moverlo un poquito en la dirección correcta. Además, si usa un motor de física, debe verificar si hay colisiones con otros actos u obstáculos.
- Actualiza las reglas del juego. Esto es lo que lo convierte en un juego y no en un experimento de física. Digamos que una bala golpeó al actor actor. Las reglas del juego le dicen al jugador que deduzca X puntos de salud y que la bala desaparezca.
- Actualizaciones de IA. A veces los actores controlados por computadora deben decidir qué hacer. ¿Ir a la izquierda o a la derecha? Encuentre un camino a un buen lugar para estar. Dispara un arma.
- Control de entrada. Actualice el actor jugador según los botones presionados en el teclado.
- Actualizar gráfico de escena. Esto puede ser avanzar una animación un paso, o actualizar la GUI para mostrar que el jugador ahora tiene 10 puntos menos de salud. Su único propósito es hacer que el juego se vea y se sienta bien.
Por donde empiezas
El requisito básico para un juego gráfico es programar gráficos. Asegúrate de poder abrir una ventana y dibujar una bola en ella.
Supongo que puedes hacer algún tipo de clases. Haz una clase de pelota. Tiene los siguientes miembros: x, y, deltaX, deltaY. Todos son enteros y en escalas de píxeles. Ahora, escribe este bucle.
forever, do this {
start measure time (in milliseconds)
//physics part
add deltaX to x
add deltaY to y
if x is bigger than the screen width, assign -deltaX to deltaX
if y is bigger than the screen height, assign -deltaY to deltaY
if x is less than 0, assign -deltaX to deltaX
if y is less than 0, assign -deltaY to deltaY
//paint
paint the ball at x, y
stop measuring time, assign this to workTime
make the thread sleep for (25 - workTime) milliseconds
}
Esto hará que la pelota rebote en los límites de las ventanas. Todavía no es un juego , sino una simulación física. Si escribe la actualización de física de bolas dentro de la clase de bolas, es fácil agregar varias bolas. Guárdelos en una lista y actualice y pinte cada uno para cada cuadro.
Puedes agregar una paleta (simular la física y hacerla controlable con el mouse o el teclado) y un objetivo del juego, como evitar que la pelota llegue a la pared izquierda. Si el juego agrega más y más bolas con el tiempo, la dificultad aumentará. Tienes un juego
¿Por qué dormir durante (25 - workTime) milisegundos? Si lo hace así, la simulación se ejecutará a un ritmo constante de 40 actualizaciones y pinturas por segundo. Será bastante suave. Si omitiera la parte de suspensión, la animación sería desigual y ocuparía el 100% de la CPU. Además, la velocidad de la pelota dependería de la velocidad de la máquina que la ejecuta. Ahora, la velocidad vertical de la pelota es de 40 * deltaY píxeles por segundo.
Lo que necesitas entender son las matrices. Ellos apuntalan los juegos. Una vez que comprenda el poder de las matrices, verá cómo los juegos se reducen a matemáticas simples.
Tomas una posición de vértice en el espacio del juego. Lo proyecta usando una matriz en la pantalla (encuentre sus coordenadas de pantalla). Interpola algunos píxeles entre él y sus vértices vecinos, y ya está. Obviamente, es una simplificación extremadamente grande, pero los fundamentos de la rasterización no son del todo complejos una vez que asimilas las matrices.
fuente