![]() |
|
Frames |
AleX-G Squadron
Member #13,593
October 2011
![]() |
When i try to create a timer using a counter, whatever button i type in, it will generate an extra frame. 1bool quit = false;
2const FPS = 80;
3int count = 0;
4ALLEGRO_TIMER *timer = NULL;
5timer = al_create_timer(1.0 / FPS);
6al_start_timer(timer);
7
8while(!quit)
9{
10//create events
11count++;
12//create a font and display it
13}
www.anothergames.com |
Neil Walker
Member #210
April 2000
![]() |
Sorry, I have no idea what you are talking about. How about posting all the code, or the parts of the code that show the error. Neil. wii:0356-1384-6687-2022, kart:3308-4806-6002. XBOX:chucklepie |
AleX-G Squadron
Member #13,593
October 2011
![]() |
It is not that it doesnt work. If you try this program, when you move your mouse, the frames will increment much faster. 1#include <allegro5\allegro.h>
2#include <allegro5\allegro_primitives.h>
3#include <allegro5\allegro_image.h>
4#include <allegro5\allegro_ttf.h>
5#include <allegro5\allegro_font.h>
6
7enum BUTON{A,D,S,W};
8
9const int width = 800, height = 600, FPS = 1;
10
11int main()
12{
13 al_init();
14 al_init_image_addon();
15 al_init_primitives_addon();
16 al_init_font_addon();
17 al_init_ttf_addon();
18
19 al_install_keyboard();
20 al_install_mouse();
21
22 bool quit = false;
23 bool buton[4] = {false,false,false,false};
24
25 int x = width / 2;
26 int y = height / 2;
27
28 int count = 0;
29
30 ALLEGRO_DISPLAY *window = al_create_display(width, height);
31 ALLEGRO_BITMAP *icon = al_load_bitmap("image/1.png");
32 ALLEGRO_FONT *font16 = al_load_ttf_font("fonts/1.ttf", 86, ALLEGRO_ALIGN_CENTRE);
33 ALLEGRO_TIMER *timer = NULL;
34 ALLEGRO_EVENT_QUEUE *event = NULL;
35
36 al_set_display_icon(window, icon);
37 al_set_window_title(window, "Game programming");
38
39 timer = al_create_timer(1.0 / FPS);
40 event = al_create_event_queue();
41
42 al_register_event_source(event, al_get_keyboard_event_source());
43 al_register_event_source(event, al_get_mouse_event_source());
44 al_register_event_source(event, al_get_display_event_source(window));
45 al_register_event_source(event, al_get_timer_event_source(timer));
46
47 al_flip_display();
48 al_hide_mouse_cursor(window);
49
50 al_start_timer(timer);
51
52 while(!quit)
53 {
54 ALLEGRO_EVENT e;
55 al_wait_for_event(event, &e);
56
57 count++;
58
59
60 if(e.type == ALLEGRO_EVENT_KEY_DOWN)
61 {
62 switch(e.keyboard.keycode)
63 {
64 case ALLEGRO_KEY_A:
65 buton[A] = true;
66 break;
67
68 case ALLEGRO_KEY_S:
69 buton[S] = true;
70 break;
71
72 case ALLEGRO_KEY_D:
73 buton[D] = true;
74 break;
75
76 case ALLEGRO_KEY_W:
77 buton[W] = true;
78 break;
79
80 case ALLEGRO_KEY_ESCAPE:
81 quit = true;
82 }
83 }
84
85 else if(e.type == ALLEGRO_EVENT_KEY_UP)
86 {
87 switch(e.keyboard.keycode)
88 {
89 case ALLEGRO_KEY_A:
90 buton[A] = false;
91 break;
92
93 case ALLEGRO_KEY_S:
94 buton[S] = false;
95 break;
96
97 case ALLEGRO_KEY_D:
98 buton[D] = false;
99 break;
100
101 case ALLEGRO_KEY_W:
102 buton[W] = false;
103 break;
104 }
105 }
106
107 else if(e.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
108 {
109 quit = true;
110 }
111
112 else if(e.type == ALLEGRO_EVENT_MOUSE_AXES)
113 {
114 x = e.mouse.x;
115 y = e.mouse.y;
116 }
117
118
119 x -= buton[A] * 10;
120 x += buton[D] * 10;
121 y -= buton[W] * 10;
122 y += buton[S] * 10;
123
124 al_draw_rectangle(x-15,y-15,x+15,y+15,al_map_rgb(0,255,0), 3.0);
125 al_draw_textf(font16, al_map_rgb(0,255,0), 300, 100, ALLEGRO_ALIGN_CENTRE, "Total frames: %i", count);
126
127 al_flip_display();
128 al_clear_to_color(al_map_rgb(0,0,0));
129
130 }
131
132 al_destroy_bitmap(icon);
133 al_destroy_display(window);
134
135}
www.anothergames.com |
Arthur Kalliokoski
Second in Command
February 2005
![]() |
I take the previous edit back, you need to set up a queue. They all watch too much MSNBC... they get ideas. |
J-Gamer
Member #12,491
January 2011
![]() |
That code increments counter at each event. Mouse movements generate lots of events, so it is to be expected that counter increases faster. " There are plenty of wonderful ideas in The Bible, but God isn't one of them." - Derezo |
CodeStepper
Member #14,495
August 2012
![]() |
Use this: 1bool quit = false;
2
3redraw = true;
4
5const FPS = 80;
6int count = 0;
7ALLEGRO_TIMER *timer = NULL;
8ALLEGRO_EVENT_QUEUE *queue = al_create_event_queue( );
9timer = al_create_timer(1.0 / FPS);
10al_start_timer(timer);
11
12while(!quit)
13{
14//create events
15// if timer event "tick", set redraw to true
16if( event.type == ALLEGRO_EVENT_TIMER )
17redraw = true;
18
19// On every FPS turn off redraw and wait for timer event
20if( al_event_queue_empty( queue ) && redraw )
21count++, redraw = false;
22
23//create a font and display it
24}
This will stop events other than timer In your code do this: 1#include <allegro5\allegro.h>
2#include <allegro5\allegro_primitives.h>
3#include <allegro5\allegro_image.h>
4#include <allegro5\allegro_ttf.h>
5#include <allegro5\allegro_font.h>
6
7enum BUTON{A,D,S,W};
8
9const int width = 800, height = 600, FPS = 1;
10
11int main()
12{
13 al_init();
14 al_init_image_addon();
15 al_init_primitives_addon();
16 al_init_font_addon();
17 al_init_ttf_addon();
18
19 al_install_keyboard();
20 al_install_mouse();
21
22 bool quit = false;
23 bool buton[4] = {false,false,false,false};
24
25 // Redraw
26 // This will stop other events
27 bool redraw = false;
28
29 int x = width / 2;
30 int y = height / 2;
31
32 int count = 0;
33
34 ALLEGRO_DISPLAY *window = al_create_display(width, height);
35 ALLEGRO_BITMAP *icon = al_load_bitmap("image/1.png");
36 ALLEGRO_FONT *font16 = al_load_ttf_font("fonts/1.ttf", 86, ALLEGRO_ALIGN_CENTRE);
37 ALLEGRO_TIMER *timer = NULL;
38 ALLEGRO_EVENT_QUEUE *event = NULL;
39
40 al_set_display_icon(window, icon);
41 al_set_window_title(window, "Game programming");
42
43 timer = al_create_timer(1.0 / FPS);
44 event = al_create_event_queue();
45
46 al_register_event_source(event, al_get_keyboard_event_source());
47 al_register_event_source(event, al_get_mouse_event_source());
48 al_register_event_source(event, al_get_display_event_source(window));
49 al_register_event_source(event, al_get_timer_event_source(timer));
50
51 al_flip_display();
52 al_hide_mouse_cursor(window);
53
54 al_start_timer(timer);
55
56 while(!quit)
57 {
58 ALLEGRO_EVENT e;
59 al_wait_for_event(event, &e);
60
61 // Better to do this on SWITCH
62 switch(e.type)
63 {
64 case ALLEGRO_EVENT_KEY_DOWN:
65 switch(e.keyboard.keycode)
66 {
67 case ALLEGRO_KEY_A:
68 buton[A] = true;
69 break;
70
71 case ALLEGRO_KEY_S:
72 buton[S] = true;
73 break;
74
75 case ALLEGRO_KEY_D:
76 buton[D] = true;
77 break;
78
79 case ALLEGRO_KEY_W:
80 buton[W] = true;
81 break;
82
83 case ALLEGRO_KEY_ESCAPE:
84 quit = true;
85 }
86 break;
87
88 case ALLEGRO_EVENT_KEY_UP:
89 switch(e.keyboard.keycode)
90 {
91 case ALLEGRO_KEY_A:
92 buton[A] = false;
93 break;
94
95 case ALLEGRO_KEY_S:
96 buton[S] = false;
97 break;
98
99 case ALLEGRO_KEY_D:
100 buton[D] = false;
101 break;
102
103 case ALLEGRO_KEY_W:
104 buton[W] = false;
105 break;
106 }
107 break;
108
109 case ALLEGRO_EVENT_DISPLAY_CLOSE:
110 quit = true;
111 break;
112
113 case ALLEGRO_EVENT_MOUSE_AXES:
114 x = e.mouse.x;
115 y = e.mouse.y;
116 break;
117 // On timer "tick" event, turn on redraw
118 case ALLEGRO_EVENT_TIMER:
119 redraw = true;
120 break;
121 }
122
123 // If you want wait only for timer event
124 if( redraw )
125 count++;
126
127
128 // Waiting for timer event and empty event queue
129 if( al_is_event_queue_empty( event ) && redraw )
130 {
131 // Turn off redraw
132 redraw = false;
133 x -= buton[A] * 10;
134 x += buton[D] * 10;
135 y -= buton[W] * 10;
136 y += buton[S] * 10;
137
138 al_draw_rectangle(x-15,y-15,x+15,y+15,al_map_rgb(0,255,0), 3.0);
139 al_draw_textf(font16, al_map_rgb(0,255,0), 300, 100, ALLEGRO_ALIGN_CENTRE, "Total frames: %i", count);
140
141 al_flip_display();
142 al_clear_to_color(al_map_rgb(0,0,0));
143 }
144
145 }
146
147 al_destroy_bitmap(icon);
148 al_destroy_display(window);
149
150}
|
Luiji99
Member #12,254
September 2010
|
Alternatively you could move your frame drawing code into your timer event handler. Programming should be fun. That's why I hate Java. |
AleX-G Squadron
Member #13,593
October 2011
![]() |
Thanks for the help! This is it with all mods codestepper gave 1#include <allegro5\allegro.h>
2#include <allegro5\allegro_primitives.h>
3#include <allegro5\allegro_image.h>
4#include <allegro5\allegro_ttf.h>
5#include <allegro5\allegro_font.h>
6
7enum BUTON{A,D,S,W};
8
9const int width = 800, height = 600, FPS = 80;
10
11int main()
12{
13 al_init();
14 al_init_image_addon();
15 al_init_primitives_addon();
16 al_init_font_addon();
17 al_init_ttf_addon();
18
19 al_install_keyboard();
20 al_install_mouse();
21
22 bool quit = false;
23 bool buton[4] = {false,false,false,false};
24
25 // Redraw
26 // This will stop other events
27 bool redraw = false;
28
29 int x = width / 2;
30 int y = height / 2;
31
32 int count = 0;
33
34 ALLEGRO_DISPLAY *window = al_create_display(width, height);
35 ALLEGRO_BITMAP *icon = al_load_bitmap("image/1.png");
36 ALLEGRO_FONT *font16 = al_load_ttf_font("fonts/1.ttf", 86, ALLEGRO_ALIGN_CENTRE);
37 ALLEGRO_TIMER *timer = NULL;
38 ALLEGRO_EVENT_QUEUE *event = NULL;
39
40 al_set_display_icon(window, icon);
41 al_set_window_title(window, "Game programming");
42
43 timer = al_create_timer(1.0 / FPS);
44 event = al_create_event_queue();
45
46 al_register_event_source(event, al_get_keyboard_event_source());
47 al_register_event_source(event, al_get_mouse_event_source());
48 al_register_event_source(event, al_get_display_event_source(window));
49 al_register_event_source(event, al_get_timer_event_source(timer));
50
51 al_flip_display();
52 al_hide_mouse_cursor(window);
53
54 al_start_timer(timer);
55
56 while(!quit)
57 {
58 ALLEGRO_EVENT e;
59 al_wait_for_event(event, &e);
60
61 // Better to do this on SWITCH
62 switch(e.type)
63 {
64 case ALLEGRO_EVENT_KEY_DOWN:
65 switch(e.keyboard.keycode)
66 {
67 case ALLEGRO_KEY_A:
68 buton[A] = true;
69 break;
70
71 case ALLEGRO_KEY_S:
72 buton[S] = true;
73 break;
74
75 case ALLEGRO_KEY_D:
76 buton[D] = true;
77 break;
78
79 case ALLEGRO_KEY_W:
80 buton[W] = true;
81 break;
82
83 case ALLEGRO_KEY_ESCAPE:
84 quit = true;
85 }
86 break;
87
88 case ALLEGRO_EVENT_KEY_UP:
89 switch(e.keyboard.keycode)
90 {
91 case ALLEGRO_KEY_A:
92 buton[A] = false;
93 break;
94
95 case ALLEGRO_KEY_S:
96 buton[S] = false;
97 break;
98
99 case ALLEGRO_KEY_D:
100 buton[D] = false;
101 break;
102
103 case ALLEGRO_KEY_W:
104 buton[W] = false;
105 break;
106 }
107 break;
108
109 case ALLEGRO_EVENT_DISPLAY_CLOSE:
110 quit = true;
111 break;
112
113 case ALLEGRO_EVENT_MOUSE_AXES:
114 x = e.mouse.x;
115 y = e.mouse.y;
116 break;
117 // On timer "tick" event, turn on redraw
118 case ALLEGRO_EVENT_TIMER:
119 redraw = true;
120 break;
121 }
122
123 // If you want wait only for timer event
124 if( redraw )
125 count++;
126
127
128 // Waiting for timer event and empty event queue
129 if( al_is_event_queue_empty( event ) && redraw )
130 {
131 // Turn off redraw
132 redraw = false;
133 x -= buton[A] * 10;
134 x += buton[D] * 10;
135 y -= buton[W] * 10;
136 y += buton[S] * 10;
137
138 al_draw_rectangle(x-15,y-15,x+15,y+15,al_map_rgb(0,255,0), 3.0);
139
140 //Coordinates
141 al_draw_textf(font16, al_map_rgb(0,255,0), 300, 100, ALLEGRO_ALIGN_CENTRE, "Coordinates X: %i Y: %i", x, y);
142
143 al_flip_display();
144 al_clear_to_color(al_map_rgb(0,0,0));
145 }
146
147 }
148
149 al_destroy_bitmap(icon);
150 al_destroy_display(window);
151
152}
www.anothergames.com |
Thomas Fjellstrom
Member #476
June 2000
![]() |
Personally I'd put the count++ inside the if() at the end there. Since a frame isn't actually drawn till that if is entered, it's more accurate to only count frames if that code has executed. But then you're not doing anything with the count variable at the moment anyway, so its a moot point. -- |
AleX-G Squadron
Member #13,593
October 2011
![]() |
Since i added FPS, what is the lowest and highest FPS the eye can see? Also, i learned that only with 4 lines of code the game becomes smoother bool redraw = false; And normally you need to put them in logic order because like this is a waste. With the count variable, since it is put count++, i would be greatly amazed of not doing anything like you said, as it increments. www.anothergames.com |
Luiji99
Member #12,254
September 2010
|
I'm pretty sure the human eye's not supposed to be able to perceive more than 24 FPS or so... Programming should be fun. That's why I hate Java. |
l j
Member #10,584
January 2009
![]() |
Luiji99 said: I'm pretty sure the human eye's not supposed to be able to perceive more than 24 FPS or so... I'm pretty sure that's bullshit.
Movies (and games?) have motion blur all over to look smoother.
|
AleX-G Squadron
Member #13,593
October 2011
![]() |
I mean a FPS about gaming, because even if human eye cannot perceive 1 FPS, www.anothergames.com |
Luiji99
Member #12,254
September 2010
|
Alex-G: if the eye wasn't able to accept more than two frames per second, the brain wouldn't get more than two frames per second, thus the brain would not be able to process more than two frames per second, thus your statement is nonsensical. taron: It would appear you're correct. I've got the chance to look it up, and (annoyingly) some sources say 10 FPS and others say hundreds. Some resources say it depends completely on the object being perceived, its motion and brightness. I.e. slow-moving fog doesn't need as many FPS as a fast-moving bullet. Though, I found information that states Halo 3 is locked at 30 FPS. AFAIK that game looks relatively smooth. Programming should be fun. That's why I hate Java. |
AleX-G Squadron
Member #13,593
October 2011
![]() |
If you see a frame(a photo) for each second, than the brain can perceive it. I tried this program and compared 30 with 80 and it was a nice difference, www.anothergames.com |
Luiji99
Member #12,254
September 2010
|
This is the flaw I see in using ALLEGRO_TIMER for logic: you can't max out FPS so you have to make sure that you use a high enough tick rate so that you don't notice anything. Programming should be fun. That's why I hate Java. |
gnolam
Member #2,030
March 2002
![]() |
The limiting factor isn't what the eye can see (24 FPS is indeed utter bollocks) but what the user's monitor can and will render. There's no use rendering at a higher frequency than the user's refresh rate. -- |
AleX-G Squadron
Member #13,593
October 2011
![]() |
This is a better version of the coordinates version without the counter and with a nice "player" name I wanted to ask if anyone of you on this forum, has thought of creating a game together in a post, even thought it could sound silly... 1#include <allegro5\allegro.h>
2#include <allegro5\allegro_primitives.h>
3#include <allegro5\allegro_image.h>
4#include <allegro5\allegro_ttf.h>
5#include <allegro5\allegro_font.h>
6
7enum BUTON{A,S,D,W};
8
9const int width = 800, height = 600, FPS = 60;
10
11int main()
12{
13 al_init();
14 al_init_primitives_addon();
15 al_init_image_addon();
16 al_init_font_addon();
17 al_init_ttf_addon();
18
19 al_install_keyboard();
20 al_install_mouse();
21
22 int x = width / 2;
23 int y = height / 2;
24
25 bool quit = false;
26 bool redraw = false;
27 bool buton[4] = {false,false,false,false};
28
29 ALLEGRO_DISPLAY *window = al_create_display(width, height);
30 ALLEGRO_BITMAP *icon = al_load_bitmap("image/1.png");
31 ALLEGRO_FONT *font16 = al_load_ttf_font("fonts/1.ttf", 80, ALLEGRO_ALIGN_CENTRE);
32 ALLEGRO_TIMER *timer = NULL;
33 ALLEGRO_EVENT_QUEUE *event = NULL;
34
35
36 timer = al_create_timer(1.0 / FPS);
37 event = al_create_event_queue();
38
39 al_register_event_source(event, al_get_keyboard_event_source());
40 al_register_event_source(event, al_get_mouse_event_source());
41 al_register_event_source(event, al_get_display_event_source(window));
42 al_register_event_source(event, al_get_timer_event_source(timer));
43
44 al_set_display_icon(window, icon);
45 al_set_window_title(window, "Game programming");
46
47 al_flip_display();
48
49 al_hide_mouse_cursor(window);
50
51 al_start_timer(timer);
52
53 while(!quit)
54 {
55 ALLEGRO_EVENT e;
56 al_wait_for_event(event, &e);
57
58 switch(e.type)
59 {
60 case ALLEGRO_EVENT_KEY_DOWN:
61 switch(e.keyboard.keycode)
62 {
63 case ALLEGRO_KEY_A:
64 buton[A] = true;
65 break;
66
67 case ALLEGRO_KEY_S:
68 buton[S] = true;
69 break;
70
71 case ALLEGRO_KEY_D:
72 buton[D] = true;
73 break;
74
75 case ALLEGRO_KEY_W:
76 buton[W] = true;
77 break;
78
79 case ALLEGRO_KEY_ESCAPE:
80 quit = true;
81 }
82 }
83
84 switch(e.type)
85 {
86 case ALLEGRO_EVENT_KEY_UP:
87 switch(e.keyboard.keycode)
88 {
89 case ALLEGRO_KEY_A:
90 buton[A] = false;
91 break;
92
93 case ALLEGRO_KEY_D:
94 buton[D] = false;
95 break;
96
97 case ALLEGRO_KEY_S:
98 buton[S] = false;
99 break;
100
101 case ALLEGRO_KEY_W:
102 buton[W] = false;
103 break;
104 }
105 }
106
107 if(e.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
108 {
109 quit = true;
110 }
111
112 switch(e.type)
113 {
114 case ALLEGRO_EVENT_MOUSE_AXES:
115 x = e.mouse.x;
116 y = e.mouse.y;
117 }
118
119 if(e.type == ALLEGRO_EVENT_TIMER)
120 {
121 redraw = true;
122 x -= buton[A] * 10;
123 x += buton[D] * 10;
124 y -= buton[W] * 10;
125 y += buton[S] * 10;
126
127 }
128
129 if(redraw && al_event_queue_is_empty(event))
130 {
131 redraw = false;
132
133 al_draw_rectangle(x-15,y-15,x+15,y+15,al_map_rgb(0,255,0),3.0);
134
135 al_draw_textf(font16, al_map_rgb(255,0,0), 300, 100, ALLEGRO_ALIGN_CENTRE, "Coordinates X: %i Y: %i", x, y);
136 al_draw_textf(font16, al_map_rgb(0,0,255), x,y, ALLEGRO_ALIGN_CENTRE, "Player");
137
138 al_flip_display();
139 al_clear_to_color(al_map_rgb(0,0,0));
140 }
141
142 }
143 al_destroy_bitmap(icon);
144 al_destroy_display(window);
145}
www.anothergames.com |
Thomas Fjellstrom
Member #476
June 2000
![]() |
gnolam said: The limiting factor isn't what the eye can see (24 FPS is indeed utter bollocks) but what the user's monitor can and will render. There's no use rendering at a higher frequency than the user's refresh rate. ^^^ That. -- |
Fishcake
Member #8,704
June 2007
![]() |
AleX-G Squadron said:
I wanted to ask if anyone of you on this forum, has thought of creating a game together in a post, even thought it could sound silly...
I think there has been several attempts to do such project here in Allegro. I found this one after searching for "project Monday". And I'm pretty sure I came across a project where everyone takes turn contributing exactly one line of code (or several), though I couldn't find it. I wonder what happened to that project..
|
AleX-G Squadron
Member #13,593
October 2011
![]() |
Must see video... i accidentally found it! www.anothergames.com |
Luiji99
Member #12,254
September 2010
|
gnolam: yeah, that sounds about right. I think I threw some factoids into a vat and smelted bullshit. Programming should be fun. That's why I hate Java. |
|