Usando temporizador y bucle de juego

Estoy construyendo un juego de consola simple, está el jugador que se mueve cuando la tecla presiona hacia abajo , y hay enemigos que se mueven automáticamente, cada tipo de enemigo se mueve una vez en X milisegundos .

Como entendí, debería usar el timer , pero realmente no sé cómo hacerlo en el bucle del juego (aún no está construido porque no sé cómo hacerlo con el temporizador, pero debería ser así while loop I pensar). el juego termina cuando el enemigo “toca” al jugador (mismo xey).

Una cosa importante: no puedo hacerlo en este ejercicio en Thread , pero si tiene otras sugerencias en lugar de usar Timer puede hacerlo.

Gracias.

Normalmente no usa temporizadores convencionales en los juegos. Los juegos tienen un mecanismo muy diferente para manejar su lógica y el tiempo que pasa, normalmente no funcionan con temporizadores o no en la forma esperada:

Los juegos normalmente tienen algo llamado bucle de juego. En términos generales, se trata de tres funciones principales que se llaman una detrás de la otra en un bucle:

 while(running) { HandleUserInput(); ChangeWorld(); Render(); } 

Obtienes la entrada del usuario, cambias el mundo del juego en consecuencia y lo dibujas en la pantalla. Ahora, cuanto más rápida sea tu computadora, más rápido se ejecutará este ciclo. Eso es bueno para los gráficos (piense en FPS), pero malo para el juego. Imagina Tetris donde se mueven cada cuadro de los bloques. Ahora no me gustaría comprar una computadora más rápida, el juego sería más difícil de esa manera.

Entonces, para mantener la velocidad del juego constante independientemente de la potencia de la computadora, el ciclo considera que pasó el tiempo:

 while(running) { var timePassedSinceLastLoop = CalculateTimeDelta(); HandleUserInput(); ChangeWorld(timePassedSinceLastLoop); Render(); } 

Ahora imagina un tiempo de reutilización para algo en el juego. El jugador presiona “a”, se produce una buena acción y, aunque puede presionar “a” otra vez, no pasará nada durante los próximos 5 segundos. Pero el juego aún se ejecuta y hace todas las otras cosas que pueden suceder en el juego. Este no es un temporizador convencional. Es una variable, vamos a llamarlo ActionCooldown, y una vez que el jugador activa la acción, se establece en 5 segundos. Cada vez que el mundo cambia, el tiempo transcurrido se resta de ese número hasta que sea cero. Todo el tiempo, el juego se está ejecutando y manejando la entrada y el renderizado. Pero solo cuando ActionCooldown llegue a cero, otra presión de “a” activará esa acción nuevamente.

El método ChangeWorld incluye todos los cambios automáticos en el mundo. Enemigos, misiles, lo que sea que se mueva sin la interacción del jugador. Y se mueve según el tiempo. Si el enemigo se mueve un cuadrado por segundo, debes hacer que sus coordenadas sean flotantes y agregar una fracción de un cuadrado cada vez que se ejecute el bucle.

Digamos que tienes 30 fps para que tu loop funcione 30 veces por segundo. Tu enemigo ahora necesita mover 1/30 de un cuadrado en cada bucle. Luego, al final, se habrá movido un cuadrado completo por segundo.

La premisa general detrás del temporizador es repetir algunos códigos cada n.

Para crear el temporizador usa esto:

  System.Timers.Timer aTimer = new System.Timers.Timer(); aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); // Set the Interval to 1 millisecond. Note: Time is set in Milliseconds aTimer.Interval=1; aTimer.Enabled=true; 

Luego implementa este método:

 private static void OnTimedEvent(object source, ElapsedEventArgs e) { //Whatever you need repeated } 

El ejemplo completo se puede encontrar aquí: http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.71).aspx