¿Cuál es la mejor forma de codificar un bucle de juego en Allegro 5 que siempre se ejecuta a la misma velocidad y que separa correctamente la lógica de dibujo de la lógica de actualización? ¿Debo usar hilos o no? ¿Debo hacer uso del nuevo sistema de eventos Allegro?Allegro 5 juego: juego de bucle que se ejecuta a velocidad constante?
5
A
Respuesta
3
Tomado del Allegro wiki:
al_install_timer(1.0/FPS);
...
while (1) {
al_wait_for_event(queue, &event);
/* handle input events */
if (event.type == ALLEGRO_EVENT_TIMER) {
handle_game_tick();
need_redraw = true;
}
if (need_redraw && al_event_queue_is_empty(queue)) {
render_last_frame();
need_redraw = false;
}
}
Si desea saltar marco, omitir el comando render_last_frame() cada vez que se detecta que se está quedando atrás en los marcos (por ejemplo, mediante el uso de la función al_current_time()).
3
Here es una versión más completa de la respuesta de Allefant (siga el enlace para la explicación detallada, línea por línea):
#include <stdio.h>
#include <allegro5/allegro.h>
const float FPS = 60;
int main(int argc, char **argv)
{
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
ALLEGRO_TIMER *timer = NULL;
bool redraw = true;
if(!al_init()) {
fprintf(stderr, "failed to initialize allegro!\n");
return -1;
}
timer = al_create_timer(1.0/FPS);
if(!timer) {
fprintf(stderr, "failed to create timer!\n");
return -1;
}
display = al_create_display(640, 480);
if(!display) {
fprintf(stderr, "failed to create display!\n");
al_destroy_timer(timer);
return -1;
}
event_queue = al_create_event_queue();
if(!event_queue) {
fprintf(stderr, "failed to create event_queue!\n");
al_destroy_display(display);
al_destroy_timer(timer);
return -1;
}
al_register_event_source(event_queue, al_get_display_event_source(display));
al_register_event_source(event_queue, al_get_timer_event_source(timer));
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
al_start_timer(timer);
while(1)
{
ALLEGRO_EVENT ev;
al_wait_for_event(event_queue, &ev);
if(ev.type == ALLEGRO_EVENT_TIMER) {
redraw = true;
}
else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
break;
}
if(redraw && al_event_queue_is_empty(event_queue)) {
redraw = false;
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
}
}
al_destroy_timer(timer);
al_destroy_display(display);
al_destroy_event_queue(event_queue);
return 0;
}
Cuestiones relacionadas
- 1. Velocidad de fotogramas constante en WPF para el juego
- 2. Android juego de bucle, cómo controlar la velocidad y velocidad de cuadro
- 3. Juego de Android con FPS constante?
- 4. Android bucle de juego sin problemas
- 5. Bucle de juego con temporizador separado para renderizar y lógica de juego
- 6. ¿Mejores bucles de juego que bucle infinito + bloque?
- 7. Juego de bucle en Win32 API
- 8. Desarrollo del juego: ¿Cómo se hace un juego de historia?
- 9. paredit juego de llaves a juego en swank-clojure repl
- 10. ¿Por qué es necesario un bucle de juego "principal" para desarrollar un juego?
- 11. Dónde colocar el bucle principal del juego en el juego de Android
- 12. pérdida de memoria en el bucle del juego
- 13. ¿Cómo implementar un bucle de juego en plátano reactivo?
- 14. con juego: deploy_via,: no remote_cache conjunto de trabajo: keep_releases, 5
- 15. Cómo ganar este juego?
- 16. Marco de juego: ¿Cómo cambiar los paquetes predeterminados de juego?
- 17. el juego no es reconocido por el centro de juego
- 18. Subcadenas a juego de un diccionario a otra cadena: ¿sugerencias?
- 19. Juego de diseño de manera OO
- 20. Juego de cuerdas?
- 21. Desarrollo de un juego Codeigniter
- 22. C# juego de azar
- 23. Arquitectura de juego multijugador
- 24. acelerar trama de datos a juego
- 25. ¿Registrar componentes de objetos de juego en los subsistemas del juego? (Diseño de objeto de juego basado en componentes)
- 26. ¡Juego! marco: las vistas no se compilan?
- 27. versión major.minor no compatible 51.0 mientras se ejecuta el marco de juego
- 28. Optimización del juego AndEngine
- 29. Juego en Android
- 30. OpenGL ejemplo 2d juego
Ah, por lo que debe hacer uso de los acontecimientos. ¿Podría el enhebrado mejorar potencialmente la estabilidad de la imagen? ¿Las colas de eventos son seguras para hilos? – amarillion
Enhebrar no ayudará en absoluto. Por lo general, puede ser útil si utiliza el tiempo exacto en el que está procesando (nuevamente, al_current_time() es su amigo). Esto permitirá que cosas como interpolar la posición exacta donde mostrar algo en relación con la lógica del juego. También debe tener en cuenta que al_flip_display() esperará a vsync (si está habilitado, pero tener vsync activado es imprescindible para la animación perfectamente uniforme de todos modos). Y A5 es 100% thread save - las colas de eventos son especialmente así ya que son uno de los medios para comunicarse a través de subprocesos. –
Enlace a la página wiki mencionada: http://wiki.allegro.cc/index.php?title=Porting_from_A4_to_A5 – Leftium