![]() |
|
Vsync-Dependent Game Loop |
DragonDePlatino
Member #16,608
December 2016
|
I recently started C programming so I decided to check out allegro 5. I've statically linked everything and confirmed allegro is correctly installed by running some examples. I want to create a simple game loop tied to vsync but I cannot do so. I've tried every combination of these I can think of but it always crashes the moment an event is found. I've tried debugging but it fails with [Inferior 1 (process 2552) exited with code 03] every time I try to add an event loop. To be clear I do not want delta time, I do not want to use timers and I do not want to pause my program's execution to wait for events. I want an SDL-style event loop where I continually render at 60 FPS regardless if there are any events in the queue. I've done this in the past with SDL 2.0, SFML and CSFML but I cannot do it with allegro. 1#include <allegro5/allegro.h>
2#include <stdio.h>
3
4static ALLEGRO_DISPLAY* display;
5static ALLEGRO_EVENT_QUEUE* window_queue;
6
7static void init(void);
8static void quit(void);
9static void loop(void);
10
11int main(void)
12{
13 init();
14 loop();
15 quit();
16}
17
18void init(void) {
19 if (!al_init()) {
20 puts("Failed to initialize allegro!");
21 exit(1);
22 }
23
24 al_set_new_display_option(ALLEGRO_VSYNC, 1, ALLEGRO_REQUIRE);
25 display = al_create_display(640, 480);
26 if (!display) {
27 puts("Failed to create display!");
28 exit(1);
29 }
30
31 window_queue = al_create_event_queue();
32 if (!window_queue) {
33 puts("Failed to create event queue!");
34 al_destroy_display(display);
35 exit(1);
36 }
37 al_register_event_source(window_queue, al_get_display_event_source(display));
38}
39
40void quit(void) {
41 al_destroy_display(display);
42 al_destroy_event_queue(window_queue);
43}
44
45void loop(void) {
46 bool window_open = true;
47 ALLEGRO_EVENT* event = NULL;
48 int value = 0;
49
50 while (window_open) {
51 while (al_get_next_event(window_queue, event)) {
52 if (event->type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
53 window_open = false;
54 }
55 }
56
57 value = (value + 1) % 256;
58 al_clear_to_color(al_map_rgb(value, value, value));
59 al_flip_display();
60 }
61}
And yes, I am aware that my game's speed will be tied to framerate and that the game will not even boot if the user does not have vsync. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
DragonDePlatino said:
ALLEGRO_EVENT* event = NULL; int value = 0; while (window_open) { while (al_get_next_event(window_queue, event)) {
You're passing NULL to al_get_next_event. You need to declare an ALLEGRO_EVENT and pass its address not an empty pointer. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
DragonDePlatino
Member #16,608
December 2016
|
Hey, I got it working! Keyboard input too! Thanks for your help. 1#include <allegro5/allegro.h>
2#include <stdio.h>
3
4static ALLEGRO_DISPLAY* display;
5static ALLEGRO_EVENT_QUEUE* event_queue;
6
7static void init(void);
8static void quit(void);
9static void loop(void);
10
11int main(void)
12{
13 init();
14 loop();
15 quit();
16}
17
18void init(void) {
19 if (!al_init()) {
20 puts("Failed to initialize allegro!");
21 exit(1);
22 }
23
24 if(!al_install_keyboard()) {
25 puts("Failed to initialize keyboard!");
26 exit(1);
27 }
28
29 al_set_new_display_option(ALLEGRO_VSYNC, 1, ALLEGRO_REQUIRE);
30 display = al_create_display(640, 480);
31 if (!display) {
32 puts("Failed to create display!");
33 exit(1);
34 }
35
36 event_queue = al_create_event_queue();
37 if (!event_queue) {
38 puts("Failed to create event queue!");
39 al_destroy_display(display);
40 exit(1);
41 }
42 al_register_event_source(event_queue, al_get_display_event_source(display));
43 al_register_event_source(event_queue, al_get_keyboard_event_source());
44}
45
46void quit(void) {
47 al_destroy_display(display);
48 al_destroy_event_queue(event_queue);
49}
50
51void loop(void) {
52 bool window_open = true;
53 ALLEGRO_EVENT event;
54 int value = 0;
55
56 while (window_open) {
57 while (al_get_next_event(event_queue, &event)) {
58 if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
59 window_open = false;
60 } else if (event.type == ALLEGRO_EVENT_KEY_DOWN) {
61 switch (event.keyboard.keycode) {
62 case ALLEGRO_KEY_ESCAPE:
63 window_open = false;
64 }
65 }
66 }
67
68 value = (value + 1) % 256;
69 al_clear_to_color(al_map_rgb(value, value, value));
70 al_flip_display();
71 }
72}
|
|