Qual è il modo migliore per codificare un ciclo di gioco in Allegro 5 che funziona sempre alla stessa velocità e che separa correttamente la logica di disegno dalla logica di aggiornamento? Dovrei usare discussioni o no? Dovrei utilizzare il nuovo sistema di eventi Allegro?Gioco Allegro 5: loop di gioco che funziona a velocità costante?
5
A
risposta
3
tratto dal wiki allegro:
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;
}
}
Se volete cornice saltare, saltare il comando render_last_frame() ogni volta che si rileva che sono in ritardo nei telai (ad esempio utilizzando la funzione al_current_time()).
3
Here è una versione più completa della risposta di Allefant (seguire il link per la dettagliata spiegazione riga per riga):
#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;
}
Problemi correlati
- 1. sul loop di gioco
- 2. Framerate costante in WPF per gioco
- 3. Ciclo di gioco Android, come controllare velocità e frame rate
- 4. Ciclo di gioco con timer separato per il rendering e logica di gioco
- 5. Migliori circuiti di gioco di loop infinito + blocco?
- 6. Come implementare un loop di gioco in banana reattiva?
- 7. gioco: come convertire a build.sbt
- 8. aggiungendo Admob a Libgdx gioco
- 9. Oggetti di gioco che parlano tra loro
- 10. Button ClickListener non funziona nel gioco LibGDX
- 11. Android ciclo di gioco liscia
- 12. Java Motore di gioco 2D per gioco basato su tile
- 13. Sincronizzazione gioco multigiocatore
- 14. Dove posizionare il ciclo di gioco principale nel gioco Android
- 15. Nim gioco questione
- 16. rilevamento collisione gioco di corse in 3D
- 17. Come vincere questo gioco?
- 18. XNA deride l'oggetto di gioco o disaccoppiando il gioco
- 19. Quando Ethereum passerà a Prova di gioco?
- 20. installazione quadro di gioco
- 21. HTML5 gioco per app nativa
- 22. Ingresso di un gioco ritmico
- 23. Utilizzare attori in gioco
- 24. Modello che rallenta il gioco - opengl
- 25. Prestazioni del gioco XNA
- 26. costruire il mio server di gioco per un multiplayer iPhone gioco a turni
- 27. Motore di gioco con script Python?
- 28. Come funziona la dinamica di un gioco di simulazione sportiva?
- 29. Simple Python Battleship gioco
- 30. OpenGL 2d esempio di gioco
Ah, così si dovrebbe fare uso di eventi. La filettatura potrebbe migliorare la stabilità dell'immagine? Le code degli eventi sono thread-safe? – amarillion
Il threading non aiuta affatto. Di solito può aiutarti se usi l'ora esatta in cui stai facendo il rendering (ancora, al_current_time() è tuo amico). Ciò consentirà cose come interpolare la posizione esatta in cui mostrare qualcosa in relazione alla logica del gioco. Dovresti anche tenere a mente che al_flip_display() aspetterà vsync (se è abilitato, ma avere vsync on è un must per l'animazione perfettamente liscia comunque). E A5 è al 100% di salvataggio del thread - le code di eventi sono particolarmente utili in quanto sono uno dei mezzi per comunicare attraverso i thread. –
Collegamento alla pagina wiki menzionata: http://wiki.allegro.cc/index.php?title=Porting_from_A4_to_A5 – Leftium