|
This thread is locked; no one can reply to it. |
1
2
|
Screen is cleared and a new one appears Allegro5 in C? |
mayna azevedo
Member #20,077
May 2021
|
HELLO!!! I'm making a very simple game in C with allegro5, and I'm trying to trigger a screen change by clicking on a certain key. For example, if you press ENTER, the entire screen is cleared and a new one appears, with a new message. Does anyone know how to tell me what I do wrong? Pressing ENTER does disappear the music aand the text, but the new one don't appear in the display. There is no error message and the document compiles, but it does not do what I want. Here is the code: 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7#include <allegro5/allegro_audio.h> // biblioteca de som
8#include <allegro5/allegro_acodec.h>
9
10void must_init(bool test, const char *description){
11 if(test) return;
12
13 printf("couldn't initialize %s\n", description);
14 exit(1);
15}
16
17int main(){
18 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
19 must_init(al_install_keyboard(), "keyboard");
20 must_init(al_install_mouse(), "mouse"); // instalando o mouse
21
22 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
23 must_init(timer, "timer");
24
25 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
26 must_init(queue, "queue");
27
28 // Permite que as formas e linhas tenham maior definição, deixar mais suave
29 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
30 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
31 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
32
33 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
34 must_init(disp, "display");
35
36 ALLEGRO_FONT* font = al_create_builtin_font();
37 must_init(font, "font");
38
39 ALLEGRO_FONT* font1 = al_create_builtin_font();
40 must_init(font1, "font1");
41
42 must_init(al_init_image_addon(), "image addon");
43 ALLEGRO_BITMAP* dino_apresentacao = al_load_bitmap("dino_apresentacao.png");
44 must_init(dino_apresentacao, "dino_apresentacao");
45
46 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
47
48 al_register_event_source(queue, al_get_keyboard_event_source());
49 al_register_event_source(queue, al_get_display_event_source(disp));
50 al_register_event_source(queue, al_get_timer_event_source(timer));
51 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
52
53 // adicionando o audio ao jogo
54 must_init(al_install_audio(), "audio");
55 must_init(al_init_acodec_addon(), "audio codecs");
56 must_init(al_reserve_samples(16), "reserve samples");
57
58 ALLEGRO_SAMPLE* elephant = al_load_sample("elephant.wav"); // audio // verificar a extenção, não funciona em mp3
59 must_init(elephant, "elephant");
60
61 // para música longa
62 ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
63 must_init(music, "music");
64 al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
65 al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair, senão tem sai
66
67 bool done = false;
68 bool redraw = true;
69 ALLEGRO_EVENT event;
70
71 float x, y;
72 x = 100;
73 y = 100;
74
75 #define KEY_SEEN 1
76 #define KEY_RELEASED 2
77
78 unsigned char key[ALLEGRO_KEY_MAX];
79 memset(key, 0, sizeof(key)); // tem que iniciar zerado
80 al_hide_mouse_cursor(disp); // faz com que o mouse do computador suma
81
82 al_start_timer(timer);
83 while(1){
84 al_wait_for_event(queue, &event);
85
86 switch(event.type) // movimento do teclado
87 {
88 case ALLEGRO_EVENT_TIMER:
89 // once again, no game logic. fishy? maybe.
90 redraw = true;
91 break;
92
93 case ALLEGRO_EVENT_KEY_CHAR: // usar na criação dos menus de navegação
94 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER)
95 {
96 al_destroy_audio_stream(music);
97 //al_destroy_display(disp);
98 //al_destroy_event_queue(queue);
99 al_destroy_font(font);
100 al_clear_to_color(al_map_rgb(0,0,0));
101 al_draw_text(font1, al_map_rgb(255, 255, 255), 200, 750, 0, "APERTEI ENTER");
102 //al_flip_display()
103 if(redraw && al_is_event_queue_empty(queue))
104 {
105 //al_get_new_display_refresh_rate();
106 al_clear_to_color(al_map_rgb(0, 0, 0));
107 al_draw_text(font1, al_map_rgb(255, 255, 255), 200, 750, 0, "APERTEI ENTER");
108 al_flip_display();
109
110 redraw = false;
111 }
112 }
113 if(event.keyboard.keycode == ALLEGRO_KEY_F)
114 al_draw_text(font, al_map_rgb(255, 255, 255), 430, 750, 0, "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @");
115
116 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
117 break;
118
119 case ALLEGRO_EVENT_DISPLAY_CLOSE:
120 done = true;
121 break;
122 }
123
124 if(done)
125 break;
126
127 if(redraw && al_is_event_queue_empty(queue))
128 {
129 al_clear_to_color(al_map_rgb(0, 0, 0));
130 al_draw_text(font, al_map_rgb(255, 255, 255), 200, 450, 0, "TESTE");
131 al_flip_display();
132
133 redraw = false;
134 }
135
136
137 }
138
139 al_destroy_bitmap(dino_apresentacao);
140 al_destroy_sample(elephant);
141 al_destroy_audio_stream(music);
142 al_destroy_font(font);
143 al_destroy_display(disp);
144 al_destroy_timer(timer);
145 al_destroy_event_queue(queue);
146
147 return 0;
148}
Can someone help me? |
Dizzy Egg
Member #10,824
March 2009
|
There is quite a lot wrong here; unfortunately I don't have your resources (images/sounds/music) so I can't run it myself. You should really be running a state system, rather than having 2 places where you try and draw. This is a very basic example, based on your code. Here the logic is seperated from the drawing. The drawing only happens once. You need to loop these steps: get event Here is working code to get you started: 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7
8char text[255] = "TESTE";
9
10void must_init(bool test, const char *description){
11 if(test) return;
12
13 printf("couldn't initialize %s\n", description);
14 exit(1);
15}
16
17int main(){
18 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
19 must_init(al_install_keyboard(), "keyboard");
20 must_init(al_install_mouse(), "mouse"); // instalando o mouse
21
22 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
23 must_init(timer, "timer");
24
25 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
26 must_init(queue, "queue");
27
28 // Permite que as formas e linhas tenham maior definição, deixar mais suave
29 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
30 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
31 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
32
33 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
34 must_init(disp, "display");
35
36 ALLEGRO_FONT* font = al_create_builtin_font();
37 must_init(font, "font");
38
39 ALLEGRO_FONT* font1 = al_create_builtin_font();
40 must_init(font1, "font1");
41
42 must_init(al_init_image_addon(), "image addon");
43
44 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
45
46 al_start_timer(timer);
47 al_register_event_source(queue, al_get_keyboard_event_source());
48 al_register_event_source(queue, al_get_display_event_source(disp));
49 al_register_event_source(queue, al_get_timer_event_source(timer));
50 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
51
52 // adicionando o audio ao jogo
53
54
55 // para música longa
56
57 bool done = false;
58 bool redraw = false;
59 ALLEGRO_EVENT event;
60
61 float x, y;
62 x = 200;
63 y = 450;
64
65 #define KEY_SEEN 1
66 #define KEY_RELEASED 2
67
68 unsigned char key[ALLEGRO_KEY_MAX];
69 memset(key, 0, sizeof(key));
70 al_hide_mouse_cursor(disp);
71
72
73
74 while(1){
75 al_wait_for_event(queue, &event);
76
77 switch(event.type)
78 {
79 case ALLEGRO_EVENT_TIMER:
80 {
81 redraw = true;
82 break;
83 }
84
85 case ALLEGRO_EVENT_KEY_CHAR:
86 {
87 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER)
88 {
89 sprintf(text, "%s", "APERTEI ENTER");
90 x = 200;
91 y = 750;
92 }
93 else if(event.keyboard.keycode == ALLEGRO_KEY_F)
94 {
95 sprintf(text, "%s", "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @");
96 x = 430;
97 y = 750;
98 }
99
100 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
101 {
102 break;
103 }
104 }
105
106 case ALLEGRO_EVENT_DISPLAY_CLOSE:
107 {
108 done = true;
109 break;
110 }
111 }
112
113 if(done)
114 break;
115
116 if(redraw && al_is_event_queue_empty(queue))
117 {
118 al_clear_to_color(al_map_rgb(0, 0, 0));
119 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
120 al_flip_display();
121
122 redraw = false;
123 }
124
125
126 }
127
128 al_destroy_font(font);
129 al_destroy_display(disp);
130 al_destroy_timer(timer);
131 al_destroy_event_queue(queue);
132
133 return 0;
134}
---------------------------------------------------- |
mayna azevedo
Member #20,077
May 2021
|
WOW, it did work! Can you answer another question? How do I make an if() in another if() work? Example: After press ENTER, it questions if a person want option A or B. How can I do this? I try to create a new if, but it did not work... 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7
8char text[255] = "TESTE";
9
10void must_init(bool test, const char *description){
11 if(test) return;
12
13 printf("couldn't initialize %s\n", description);
14 exit(1);
15}
16
17int main(){
18 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
19 must_init(al_install_keyboard(), "keyboard");
20 must_init(al_install_mouse(), "mouse"); // instalando o mouse
21
22 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
23 must_init(timer, "timer");
24
25 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
26 must_init(queue, "queue");
27
28 // Permite que as formas e linhas tenham maior definição, deixar mais suave
29 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
30 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
31 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
32
33 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
34 must_init(disp, "display");
35
36 ALLEGRO_FONT* font = al_create_builtin_font();
37 must_init(font, "font");
38
39 ALLEGRO_FONT* font1 = al_create_builtin_font();
40 must_init(font1, "font1");
41
42 must_init(al_init_image_addon(), "image addon");
43
44 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
45
46 al_start_timer(timer);
47 al_register_event_source(queue, al_get_keyboard_event_source());
48 al_register_event_source(queue, al_get_display_event_source(disp));
49 al_register_event_source(queue, al_get_timer_event_source(timer));
50 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
51
52 // adicionando o audio ao jogo
53
54
55 // para música longa
56
57 bool done = false;
58 bool redraw = false;
59 ALLEGRO_EVENT event;
60
61 float x, y;
62 x = 200;
63 y = 450;
64
65 #define KEY_SEEN 1
66 #define KEY_RELEASED 2
67
68 unsigned char key[ALLEGRO_KEY_MAX];
69 memset(key, 0, sizeof(key));
70 al_hide_mouse_cursor(disp);
71
72
73
74 while(1){
75 al_wait_for_event(queue, &event);
76
77 switch(event.type)
78 {
79 case ALLEGRO_EVENT_TIMER:
80 {
81 redraw = true;
82 break;
83 }
84
85 case ALLEGRO_EVENT_KEY_CHAR:
86 {
87 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER)
88 {
89 sprintf(text, "%s", "APERTEI ENTER");
90 x = 200;
91 y = 750;
92
93 if(event.keyboard.keycode == ALLEGRO_KEY_A)
94 {
95 sprintf(text, "%s", "PRESS A");
96 x = 200;
97 y = 750;
98
99 if(event.keyboard.keycode == ALLEGRO_KEY_B)
100 {
101 sprintf(text, "%s", "PRESS B");
102 x = 200;
103 y = 750;
104 }
105 }
106 }
107 else if(event.keyboard.keycode == ALLEGRO_KEY_F)
108 {
109 sprintf(text, "%s", "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @");
110 x = 430;
111 y = 750;
112 }
113
114 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
115 {
116 break;
117 }
118 }
119
120 case ALLEGRO_EVENT_DISPLAY_CLOSE:
121 {
122 done = true;
123 break;
124 }
125 }
126
127 if(done)
128 break;
129
130 if(redraw && al_is_event_queue_empty(queue))
131 {
132 al_clear_to_color(al_map_rgb(0, 0, 0));
133 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
134 al_flip_display();
135
136 redraw = false;
137 }
138
139
140 }
141
142 al_destroy_font(font);
143 al_destroy_display(disp);
144 al_destroy_timer(timer);
145 al_destroy_event_queue(queue);
146
147 return 0;
148}
Many thanks |
Dizzy Egg
Member #10,824
March 2009
|
This is why we need a "state"; we need to know what state the game is in, because we only want to drawn once in our loop. We create different states, and when we press keys, we check our state to see what should happen. In this code, we check the key pressed, but we also check the state, to see what we should do. Now you can press enter if the state is "STATE_START". Then you can press A or B. You can also press backspace; if you have only pressed enter, we will go back to the start; if you have pressed enter, then pressed A or B, we will go back to "STATE_PRESSED_ENTER". We can then press backspace again, to go back to start, or we can press A or B again. It is important to know what state our game is in, then we can make decisions in our logic. If we do not know what state the game is in, we cannot make decisions: 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7
8//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
9#define STATE_START 1
10#define STATE_PRESSED_ENTER 2
11#define STATE_PRESSED_A_OR_B 3
12
13int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
14
15
16char text[255] = "TESTE";
17
18void must_init(bool test, const char *description){
19 if(test) return;
20
21 printf("couldn't initialize %s\n", description);
22 exit(1);
23}
24
25int main(){
26 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
27 must_init(al_install_keyboard(), "keyboard");
28 must_init(al_install_mouse(), "mouse"); // instalando o mouse
29
30 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
31 must_init(timer, "timer");
32
33 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
34 must_init(queue, "queue");
35
36 // Permite que as formas e linhas tenham maior definição, deixar mais suave
37 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
38 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
39 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
40
41 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
42 must_init(disp, "display");
43
44 ALLEGRO_FONT* font = al_create_builtin_font();
45 must_init(font, "font");
46
47 ALLEGRO_FONT* font1 = al_create_builtin_font();
48 must_init(font1, "font1");
49
50 must_init(al_init_image_addon(), "image addon");
51
52 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
53
54 al_start_timer(timer);
55 al_register_event_source(queue, al_get_keyboard_event_source());
56 al_register_event_source(queue, al_get_display_event_source(disp));
57 al_register_event_source(queue, al_get_timer_event_source(timer));
58 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
59
60 // adicionando o audio ao jogo
61
62
63 // para música longa
64
65 bool done = false;
66 bool redraw = false;
67 ALLEGRO_EVENT event;
68
69 float x, y;
70 x = 200;
71 y = 450;
72
73 #define KEY_SEEN 1
74 #define KEY_RELEASED 2
75
76 unsigned char key[ALLEGRO_KEY_MAX];
77 memset(key, 0, sizeof(key));
78 al_hide_mouse_cursor(disp);
79
80
81
82 while(1){
83 al_wait_for_event(queue, &event);
84
85 switch(event.type)
86 {
87 case ALLEGRO_EVENT_TIMER:
88 {
89 redraw = true;
90 break;
91 }
92
93 case ALLEGRO_EVENT_KEY_CHAR:
94 {
95 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
96 {
97 sprintf(text, "%s", "APERTEI ENTER");
98 x = 200;
99 y = 750;
100 gameState = STATE_PRESSED_ENTER; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
101
102 }
103
104 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_ENTER) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
105 {
106 sprintf(text, "%s", "PRESS A");
107 x = 200;
108 y = 750;
109 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
110 }
111
112 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_ENTER) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED ENTER"...
113 {
114 sprintf(text, "%s", "PRESS B");
115 x = 200;
116 y = 750;
117 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
118 }
119
120 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
121 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
122 {
123 if(gameState == STATE_PRESSED_ENTER) //IF WE HAVE ONLY PRESSED ENTER...
124 {
125 sprintf(text, "%s", "TESTE");
126 x = 200;
127 y = 450;
128 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
129 }
130
131 else if(gameState == STATE_PRESSED_A_OR_B) //ELSE IF WE HAVE PRESSED A OR B...
132 {
133 sprintf(text, "%s", "APERTEI ENTER");
134 x = 200;
135 y = 750;
136 gameState = STATE_PRESSED_ENTER; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
137 }
138 }
139 else if(event.keyboard.keycode == ALLEGRO_KEY_F)
140 {
141 sprintf(text, "%s", "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @");
142 x = 430;
143 y = 750;
144 }
145
146 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
147 {
148 break;
149 }
150 }
151
152 case ALLEGRO_EVENT_DISPLAY_CLOSE:
153 {
154 done = true;
155 break;
156 }
157 }
158
159 if(done)
160 break;
161
162 if(redraw && al_is_event_queue_empty(queue))
163 {
164 al_clear_to_color(al_map_rgb(0, 0, 0));
165 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
166 al_flip_display();
167
168 redraw = false;
169 }
170
171
172 }
173
174 al_destroy_font(font);
175 al_destroy_display(disp);
176 al_destroy_timer(timer);
177 al_destroy_event_queue(queue);
178
179 return 0;
180}
REMEMBER...we loop every time, so we cannot check 2 key presses in a single pass; we go: get event So we need to get each event, every loop. This is why we need a state; we need to know what happened last loop, so we can make a decision on the next loop...
---------------------------------------------------- |
mayna azevedo
Member #20,077
May 2021
|
Hello. I don't know if I really understood . Actually, not kkkkkk. Thinking that I will always have an if () inside another if (), do I have to create decision levels with STATE_PRESSED? I did below how it would look, more or less, the structure of the game. But as predicted, it is not working. The order is: Start with ENTER, and the user chooses between A or B. If you choose A, inside you will have another choice, from A or B, and it will go on. I'm sorry for the questions, but I don't understand anything about this library . 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7
8//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
9#define STATE_START 1
10#define STATE_PRESSED_ENTER 2
11#define STATE_PRESSED_A_OR_B 3
12#define STATE_PRESSED_FASE_4 4
13
14int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
15
16
17char text[255] = "PRESS ENTER TO START THE GAME";
18
19void must_init(bool test, const char *description){
20 if(test) return;
21
22 printf("couldn't initialize %s\n", description);
23 exit(1);
24}
25
26int main(){
27 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
28 must_init(al_install_keyboard(), "keyboard");
29 must_init(al_install_mouse(), "mouse"); // instalando o mouse
30
31 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
32 must_init(timer, "timer");
33
34 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
35 must_init(queue, "queue");
36
37 // Permite que as formas e linhas tenham maior definição, deixar mais suave
38 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
39 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
40 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
41
42 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
43 must_init(disp, "display");
44
45 ALLEGRO_FONT* font = al_create_builtin_font();
46 must_init(font, "font");
47
48 ALLEGRO_FONT* font1 = al_create_builtin_font();
49 must_init(font1, "font1");
50
51 must_init(al_init_image_addon(), "image addon");
52
53 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
54
55 al_start_timer(timer);
56 al_register_event_source(queue, al_get_keyboard_event_source());
57 al_register_event_source(queue, al_get_display_event_source(disp));
58 al_register_event_source(queue, al_get_timer_event_source(timer));
59 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
60
61 // adicionando o audio ao jogo
62
63
64 // para música longa
65
66 bool done = false;
67 bool redraw = false;
68 ALLEGRO_EVENT event;
69
70 float x, y;
71 x = 200;
72 y = 450;
73
74 #define KEY_SEEN 1
75 #define KEY_RELEASED 2
76
77 unsigned char key[ALLEGRO_KEY_MAX];
78 memset(key, 0, sizeof(key));
79 al_hide_mouse_cursor(disp);
80
81
82
83 while(1){
84 al_wait_for_event(queue, &event);
85
86 switch(event.type)
87 {
88 case ALLEGRO_EVENT_TIMER:
89 {
90 redraw = true;
91 break;
92 }
93
94 case ALLEGRO_EVENT_KEY_CHAR:
95 {
96 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
97 {
98 sprintf(text, "%s", "1º FASE: CHOOSE TO DO ACCTION A OR B");
99 x = 200;
100 y = 750;
101 gameState = STATE_PRESSED_ENTER; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
102
103 if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_ENTER) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
104 {
105 sprintf(text, "%s", "PRESS A 1º decision, choose A OR B: ");
106 x = 200;
107 y = 750;
108 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
109
110 if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
111 {
112 sprintf(text, "%s", "PRESS A, 2º DECISION, choose A OR B:");
113 x = 200;
114 y = 750;
115 gameState = STATE_PRESSED_FASE_4; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
116 } else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
117 {
118 sprintf(text, "%s", "PRESS B, 2º DECISION, choose A OR B:");
119 x = 200;
120 y = 750;
121 gameState = STATE_PRESSED_FASE_4; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
122 }
123 }else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_ENTER) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED ENTER"...
124 {
125 sprintf(text, "%s", "PRESS B, 1º DECISION");
126 x = 200;
127 y = 750;
128 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
129
130 if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
131 {
132 sprintf(text, "%s", "PRESS A, 2º DECISION, choose A OR B:");
133 x = 200;
134 y = 750;
135 gameState = STATE_PRESSED_FASE_4; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
136 }
137 }
138 }
139
140 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
141 {
142 break;
143 }
144 }
145
146 case ALLEGRO_EVENT_DISPLAY_CLOSE:
147 {
148 done = true;
149 break;
150 }
151 }
152
153 if(done)
154 break;
155
156 if(redraw && al_is_event_queue_empty(queue))
157 {
158 al_clear_to_color(al_map_rgb(0, 0, 0));
159 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
160 al_flip_display();
161
162 redraw = false;
163 }
164
165
166 }
167
168 al_destroy_font(font);
169 al_destroy_display(disp);
170 al_destroy_timer(timer);
171 al_destroy_event_queue(queue);
172
173 return 0;
174}
Thank you for your help. |
Dizzy Egg
Member #10,824
March 2009
|
You need to remember that your game is looping, with one event at a time. The reason your code does not work is because you are trying to decide on 2 things in one event. When a key is pressed, only 1 key is pressed. You can't say: IF key enter, IF key A.... You need to think in terms of a single pass each loop. This is why you need a state. You need to check a single key each time. The only way your example would work would be if the user pressed ENTER and A at the same time... Please keep asking, I like helping, and no, this is not easy, but you can only get better, and when you do understand it, you will be much happier
---------------------------------------------------- |
mayna azevedo
Member #20,077
May 2021
|
Okay, I think I'm starting to understand. Can you explain more about this part of STATE? I understood (I think) how to use it for one case after another, as in the code below. But what I do when an if () generates another if (), for decision? I'm thinking in normal logic of C: the story will change according to each choice, which will generate several different ends, but I'm not able to think how to do this. I have to create the states, correct? Just like you did below What do the numbers at the end of the line indicate? For several stories, would you have to do a different state? Example: #define STATE_HISTORY_1 4 Thank you so much for your help, I don't know what I would do without it. 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7
8//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
9#define STATE_START 1
10#define STATE_PRESSED_ENTER 2
11#define STATE_PRESSED_A_OR_B 3
12
13int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
14
15
16char text[255] = "PRESS ENTER";
17
18void must_init(bool test, const char *description){
19 if(test) return;
20
21 printf("couldn't initialize %s\n", description);
22 exit(1);
23}
24
25int main(){
26 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
27 must_init(al_install_keyboard(), "keyboard");
28 must_init(al_install_mouse(), "mouse"); // instalando o mouse
29
30 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
31 must_init(timer, "timer");
32
33 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
34 must_init(queue, "queue");
35
36 // Permite que as formas e linhas tenham maior definição, deixar mais suave
37 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
38 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
39 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
40
41 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
42 must_init(disp, "display");
43
44 ALLEGRO_FONT* font = al_create_builtin_font();
45 must_init(font, "font");
46
47 ALLEGRO_FONT* font1 = al_create_builtin_font();
48 must_init(font1, "font1");
49
50 must_init(al_init_image_addon(), "image addon");
51
52 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
53
54 al_start_timer(timer);
55 al_register_event_source(queue, al_get_keyboard_event_source());
56 al_register_event_source(queue, al_get_display_event_source(disp));
57 al_register_event_source(queue, al_get_timer_event_source(timer));
58 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
59
60 // adicionando o audio ao jogo
61
62
63 // para música longa
64
65 bool done = false;
66 bool redraw = false;
67 ALLEGRO_EVENT event;
68
69 float x, y;
70 x = 200;
71 y = 450;
72
73 #define KEY_SEEN 1
74 #define KEY_RELEASED 2
75
76 unsigned char key[ALLEGRO_KEY_MAX];
77 memset(key, 0, sizeof(key));
78 al_hide_mouse_cursor(disp);
79
80
81
82 while(1){
83 al_wait_for_event(queue, &event);
84
85 switch(event.type)
86 {
87 case ALLEGRO_EVENT_TIMER:
88 {
89 redraw = true;
90 break;
91 }
92
93 case ALLEGRO_EVENT_KEY_CHAR:
94 {
95 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
96 {
97 sprintf(text, "%s", "YOU PRESS ENTER. \nCHOOSE A OR B 1º: ");
98 x = 200;
99 y = 750;
100 gameState = STATE_PRESSED_ENTER; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
101
102 }
103
104 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_ENTER) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
105 {
106 sprintf(text, "%s", "YOU PRESS A, CHOOSE A OR B 2º");
107 x = 200;
108 y = 750;
109 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
110 }
111
112 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_ENTER) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED ENTER"...
113 {
114 sprintf(text, "%s", "YOU PRESS B, CHOOSE A OR B 2º");
115 x = 200;
116 y = 750;
117 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
118 }
119
120 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
121 {
122 sprintf(text, "%s", "YOU PRESS A, CHOOSE A OR B 3º");
123 x = 200;
124 y = 750;
125 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
126 }
127
128 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED ENTER"...
129 {
130 sprintf(text, "%s", "YOU PRESS B, CHOOSE A OR B 3º");
131 x = 200;
132 y = 750;
133 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
134 }
135
136 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED_ENTER"...
137 {
138 sprintf(text, "%s", "YOU PRESS A, CHOOSE A OR B 4º");
139 x = 200;
140 y = 750;
141 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
142 }
143
144 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_A_OR_B) //WE MUST HAVE PRESSED ENTER, BECAUSE NOW STATE IS "PRESSED ENTER"...
145 {
146 sprintf(text, "%s", "YOU PRESS B, CHOOSE A OR B 4º");
147 x = 200;
148 y = 750;
149 gameState = STATE_PRESSED_A_OR_B; //...NOW WE CHANGE STATE TO "PRESSED A OR B"
150 }
151
152 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
153 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
154 {
155 if(gameState == STATE_PRESSED_ENTER) //IF WE HAVE ONLY PRESSED ENTER...
156 {
157 sprintf(text, "%s", "TESTE");
158 x = 200;
159 y = 450;
160 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
161 }
162
163 else if(gameState == STATE_PRESSED_A_OR_B) //ELSE IF WE HAVE PRESSED A OR B...
164 {
165 sprintf(text, "%s", "APERTEI ENTER");
166 x = 200;
167 y = 750;
168 gameState = STATE_PRESSED_ENTER; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
169 }
170 }
171 else if(event.keyboard.keycode == ALLEGRO_KEY_F)
172 {
173 sprintf(text, "%s", "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @");
174 x = 430;
175 y = 750;
176 }
177
178 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
179 {
180 break;
181 }
182 }
183
184 case ALLEGRO_EVENT_DISPLAY_CLOSE:
185 {
186 done = true;
187 break;
188 }
189 }
190
191 if(done)
192 break;
193
194 if(redraw && al_is_event_queue_empty(queue))
195 {
196 al_clear_to_color(al_map_rgb(0, 0, 0));
197 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
198 al_flip_display();
199
200 redraw = false;
201 }
202
203
204 }
205
206 al_destroy_font(font);
207 al_destroy_display(disp);
208 al_destroy_timer(timer);
209 al_destroy_event_queue(queue);
210
211 return 0;
212}
|
Dizzy Egg
Member #10,824
March 2009
|
Yes, for different stories, you need a state for each story. The numbers at the end are just an integer... ...the thing to remember is, the event/logic/draw happens 30 times every second! We have to constantly "loop", but the user may not press a key for 2 minutes, so we need to check each loop, and we need a "state" to know what to do. What you will want to do, as your game grows, is to create "functions", so you seperate the code into small chunks. That way you can manage it. You are thinking that, if I press one key then IF......no, not that way with games programming. Remember, the game is looping 30 times every second! Very fast. If we only did one thing at a time, it would be: Draw Screen This is NOT what you want to do; games work by looping all the time. We loop and loop and loop. If no key is pressed, we draw screen. If another thing happens (user pressed key) we can work out logic. The loop is happening 30/60/120/240 times per second! Don't think that you do one thing, then one thing, then one thing....you have to get used to loop...so as I said, our logic is: get event over and over and over again! Not: Draw Screen That is not the way! You have to loop, every loop (30 frames a second, or 60 times a second, or 240 times a second) and before you draw, work out logic...
---------------------------------------------------- |
mayna azevedo
Member #20,077
May 2021
|
Hi. Can you explain this part better to me? 1 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
2 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
3 {
4 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
5 {
6 sprintf(text, "%s", "TESTE");
7 x = 100;
8 y = 400;
9 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
10 }
11
12 else if(gameState == STATE_PRESSED_PULA_BURACO) //ELSE IF WE HAVE PRESSED A OR B...
13 {
14 sprintf(text, "%s", "APERTEI ENTER");
15 x = 100;
16 y = 400;
17 gameState = STATE_PRESSED_BURACO; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
18 }
19 }
This is what I've done so far, and it's finally working! 2#include <stdio.h>
3#include <stdlib.h>
4#include <allegro5/allegro5.h>
5#include <allegro5/allegro_font.h>
6#include <allegro5/allegro_image.h>
7#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
8
9//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
10#define STATE_START 1
11#define STATE_PRESSED_BURACO 2
12#define STATE_PRESSED_PULA_BURACO 3
13#define STATE_PRESSED_CAI_BURACO 4
14#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
15#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
16#define STATE_PRESSED_MACHUCADO_CORRE 7
17#define STATE_PRESSED_MACHUCADO_DESCANSA 8
18#define STATE_PRESSED_GAME_OVER 9
19#define STATE_PRESSED_SONO_CORRE 10
20#define STATE_PRESSED_SONO_DESCANSA 11
21
22int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
23
24
25char text[255] = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
26char text1[255] = " ";
27
28void must_init(bool test, const char *description){
29 if(test) return;
30
31 printf("couldn't initialize %s\n", description);
32 exit(1);
33}
34
35int main(){
36 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
37 must_init(al_install_keyboard(), "keyboard");
38 must_init(al_install_mouse(), "mouse"); // instalando o mouse
39
40 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
41 must_init(timer, "timer");
42
43 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
44 must_init(queue, "queue");
45
46 // Permite que as formas e linhas tenham maior definição, deixar mais suave
47 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
48 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
49 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
50
51 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
52 must_init(disp, "display");
53
54 ALLEGRO_FONT* font = al_create_builtin_font();
55 must_init(font, "font");
56
57 must_init(al_init_image_addon(), "image addon");
58
59 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
60
61 al_start_timer(timer);
62 al_register_event_source(queue, al_get_keyboard_event_source());
63 al_register_event_source(queue, al_get_display_event_source(disp));
64 al_register_event_source(queue, al_get_timer_event_source(timer));
65 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
66
67 // adicionando o audio ao jogo
68
69
70 // para música longa
71
72 bool done = false;
73 bool redraw = false;
74 ALLEGRO_EVENT event;
75
76 float x, y;
77 x = 100;
78 y = 400;
79
80 #define KEY_SEEN 1
81 #define KEY_RELEASED 2
82
83 unsigned char key[ALLEGRO_KEY_MAX];
84 memset(key, 0, sizeof(key));
85 al_hide_mouse_cursor(disp);
86
87
88
89 while(1){
90 al_wait_for_event(queue, &event);
91
92 switch(event.type)
93 {
94 case ALLEGRO_EVENT_TIMER:
95 {
96 redraw = true;
97 break;
98 }
99
100 case ALLEGRO_EVENT_KEY_CHAR:
101 {
102 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
103 {
104 sprintf(text, "%s", "INICIO DO JOGO. DINO VÊ UM BURACO: PULA (A) OU NÃO (B): ");
105 x = 100;
106 y = 400;
107 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
108
109 }
110 // PULA BURACO
111 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO)
112 {
113 sprintf(text, "%s", "DINO PULOU O BURACO, MAS MACHUCOU A PATA. DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?");
114 x = 100;
115 y = 400;
116 gameState = STATE_PRESSED_PULA_BURACO;
117 }
118
119 // DINO PULA BURACO E CORRE
120 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO)
121 {
122 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MESMO MACHUCADO, MAS SUA VELOCIDADE É BAIXA. DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR (B)?");
123 x = 100;
124 y = 100;
125 gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
126 }
127
128 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
129 {
130 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MESMO MACHUCADO, MAS SUA VELOCIDADE É BAIXA. ASSIM, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO.");
131 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
132 x = 100;
133 y = 400;
134 gameState = STATE_PRESSED_MACHUCADO_CORRE;
135 }
136
137 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
138 {
139 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO.");
140 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
141 x = 100;
142 y = 400;
143 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
144 }
145
146 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
147 {
148 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
149 sprintf(text1, "%s", "GAME OVER");
150 x = 100;
151 y = 400;
152 gameState = STATE_PRESSED_GAME_OVER;
153 }
154
155 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE)
156 {
157 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
158 sprintf(text1, "%s", "GAME OVER");
159 x = 100;
160 y = 400;
161 gameState = STATE_PRESSED_GAME_OVER;
162 }
163
164 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
165 {
166 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
167 sprintf(text1, "%s", "GAME OVER");
168 x = 100;
169 y = 400;
170 gameState = STATE_PRESSED_GAME_OVER;
171 }
172
173 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
174 {
175 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
176 sprintf(text1, "%s", "GAME OVER");
177 x = 100;
178 y = 400;
179 gameState = STATE_PRESSED_GAME_OVER;
180 }
181
182 //DINO PULA O BURACO E COME A PLANTA
183 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
184 {
185 sprintf(text, "%s", "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.");
186 sprintf(text1, "%s", "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?");
187 x = 100;
188 y = 400;
189 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
190 }
191
192 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
193 {
194 sprintf(text, "%s", "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO");
195 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
196 x = 100;
197 y = 400;
198 gameState = STATE_PRESSED_SONO_CORRE;
199 }
200
201 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
202 {
203 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.");
204 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
205 x = 100;
206 y = 400;
207 gameState = STATE_PRESSED_SONO_DESCANSA;
208 }
209
210 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
211 {
212 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
213 sprintf(text1, "%s", "GAME OVER");
214 x = 100;
215 y = 400;
216 gameState = STATE_PRESSED_GAME_OVER;
217 }
218
219 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
220 {
221 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
222 sprintf(text1, "%s", "GAME OVER");
223 x = 100;
224 y = 400;
225 gameState = STATE_PRESSED_GAME_OVER;
226 }
227
228 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
229 {
230 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
231 sprintf(text1, "%s", "GAME OVER");
232 x = 100;
233 y = 400;
234 gameState = STATE_PRESSED_GAME_OVER;
235 }
236
237 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
238 {
239 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
240 sprintf(text1, "%s", "GAME OVER");
241 x = 100;
242 y = 400;
243 gameState = STATE_PRESSED_GAME_OVER;
244 }
245
246
247 // CAI NO BURACO
248 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
249 {
250 sprintf(text, "%s", "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
251 x = 100;
252 y = 400;
253 gameState = STATE_PRESSED_CAI_BURACO;
254 }
255
256 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
257 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
258 {
259 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
260 {
261 sprintf(text, "%s", "TESTE");
262 x = 100;
263 y = 400;
264 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
265 }
266
267 else if(gameState == STATE_PRESSED_PULA_BURACO) //ELSE IF WE HAVE PRESSED A OR B...
268 {
269 sprintf(text, "%s", "APERTEI ENTER");
270 x = 100;
271 y = 400;
272 gameState = STATE_PRESSED_BURACO; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
273 }
274 }
275
276 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
277 {
278 break;
279 }
280 }
281
282 case ALLEGRO_EVENT_DISPLAY_CLOSE:
283 {
284 done = true;
285 break;
286 }
287 }
288
289 if(done)
290 break;
291
292 if(redraw && al_is_event_queue_empty(queue))
293 {
294 al_clear_to_color(al_map_rgb(0, 0, 0));
295 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
296 al_draw_text(font, al_map_rgb(255, 255, 255), 500, 500, 0, text1);
297 al_flip_display();
298
299 redraw = false;
300 }
301
302 }
303
304 al_destroy_font(font);
305 al_destroy_display(disp);
306 al_destroy_timer(timer);
307 al_destroy_event_queue(queue);
308
309 return 0;
310}
I have two more questions: How can I change the style of the letters, make them bigger and how can I make the game return to the beginning of the game, as soon as it ends, letting the player play again. Thank you soooooooooooooo much!!! |
Dizzy Egg
Member #10,824
March 2009
|
mayna azevedo said: Can you explain this part better to me? Yes; what we are doing here is reducing the number of conditions. We want to make the code as small as possible, so rather than saying: we can wrap that up, as we don't want to check key==a every time. So, we can say: if(key == a) //we only need to check key one time for multiple states { if(state == some_state_1) else if(state == some_state_2) else if(state == some_state_3) } That will make our code easier to read, and easier to add new states when key==a. Quote: How can I change the style of the letters, make them bigger For this you will need to use the font addon. You will need to include the ttf_font header (#include <allegro5/allegro_ttf.h>) and initialise it (al_init_ttf_addon()). You can then use: al_load_font("filename.ttf", size, flags); The second argument will let you choose the size. Then, when you draw your text, it will be larger, depending on the size you choose when you load. Quote: how can I make the game return to the beginning of the game, as soon as it ends, letting the player play again Well, you don't want to wait for a key, but I guess you don't want to go there straight away, as you want to display a message first? So I would suggest, add a new timer, that you can start/stop. You can start it when it's game over, and then check it every frame - if it's counter goes up, you know it's passed and can then restart the game. Here is working code for you. I have added the ttf_fonts (ttf file is arial unicode, I can't attach as it's too big, but you should have a unicode font on your computer), and made it larger. I have also added a new timer, gameOverTimer, that will display "GAME OVER" for 3 seconds and then restart the game. I'll let you look at it, and then you can ask more if you need! 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
7#include <allegro5/allegro_ttf.h> //NEED FOR TTF FONTS
8
9//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
10#define STATE_START 1
11#define STATE_PRESSED_BURACO 2
12#define STATE_PRESSED_PULA_BURACO 3
13#define STATE_PRESSED_CAI_BURACO 4
14#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
15#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
16#define STATE_PRESSED_MACHUCADO_CORRE 7
17#define STATE_PRESSED_MACHUCADO_DESCANSA 8
18#define STATE_PRESSED_GAME_OVER 9
19#define STATE_PRESSED_SONO_CORRE 10
20#define STATE_PRESSED_SONO_DESCANSA 11
21
22int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
23
24
25char text[255] = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
26char text1[255] = " ";
27
28void must_init(bool test, const char *description){
29 if(test) return;
30
31 printf("couldn't initialize %s\n", description);
32 exit(1);
33}
34
35int main(){
36 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
37 must_init(al_install_keyboard(), "keyboard");
38 must_init(al_install_mouse(), "mouse"); // instalando o mouse
39
40 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
41 must_init(timer, "timer");
42
43 ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer will last 3 seconds
44 must_init(gameOverTimer, "gameOverTimer");
45
46 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
47 must_init(queue, "queue");
48
49 // Permite que as formas e linhas tenham maior definição, deixar mais suave
50 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
51 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
52 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
53
54 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
55 must_init(disp, "display");
56
57 must_init(al_init_image_addon(), "image addon");
58
59 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
60
61 must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
62 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
63 ALLEGRO_FONT* font = al_load_ttf_font("arialuni.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
64
65 al_start_timer(timer);
66 al_register_event_source(queue, al_get_keyboard_event_source());
67 al_register_event_source(queue, al_get_display_event_source(disp));
68 al_register_event_source(queue, al_get_timer_event_source(timer));
69 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
70
71 // adicionando o audio ao jogo
72
73
74 // para música longa
75
76 bool done = false;
77 bool redraw = false;
78 ALLEGRO_EVENT event;
79
80 float x, y;
81 x = 100;
82 y = 400;
83
84 #define KEY_SEEN 1
85 #define KEY_RELEASED 2
86
87 unsigned char key[ALLEGRO_KEY_MAX];
88 memset(key, 0, sizeof(key));
89 al_hide_mouse_cursor(disp);
90
91
92
93 while(1){
94 al_wait_for_event(queue, &event);
95
96 switch(event.type)
97 {
98 case ALLEGRO_EVENT_TIMER:
99 {
100 redraw = true;
101
102 if(gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //IF STATE IS GAME OVER AND TIMER HAS TICKED AT LEAST ONCE...
103 {
104 sprintf(text, "%s", "TESTE");
105 x = 100;
106 y = 400;
107 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
108
109 //RESET THE GAME OVER TIMER!
110 al_stop_timer(gameOverTimer);
111 al_set_timer_count(gameOverTimer, 0);
112 }
113
114 break;
115 }
116
117 case ALLEGRO_EVENT_KEY_CHAR:
118 {
119 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
120 {
121 sprintf(text, "%s", "INICIO DO JOGO. DINO VĂ UM BURACO: PULA (A) OU NĂO (B): ");
122 x = 100;
123 y = 400;
124 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
125
126 }
127 // PULA BURACO
128 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO)
129 {
130 sprintf(text, "%s", "DINO PULOU O BURACO, MAS MACHUCOU A PATA. DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?");
131 x = 10;
132 y = 400;
133 gameState = STATE_PRESSED_PULA_BURACO;
134 }
135
136 // DINO PULA BURACO E CORRE
137 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO)
138 {
139 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MESMO MACHUCADO, MAS SUA VELOCIDADE É BAIXA. DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR (B)?");
140 x = 10;
141 y = 100;
142 gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
143 }
144
145 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
146 {
147 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MESMO MACHUCADO, MAS SUA VELOCIDADE É BAIXA. ASSIM, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO.");
148 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
149 x = 10;
150 y = 400;
151 gameState = STATE_PRESSED_MACHUCADO_CORRE;
152 }
153
154 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
155 {
156 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO.");
157 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
158 x = 10;
159 y = 4000;
160 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
161 }
162
163 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
164 {
165 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
166 sprintf(text1, "%s", "GAME OVER");
167 x = 100;
168 y = 400;
169 gameState = STATE_PRESSED_GAME_OVER;
170 al_start_timer(gameOverTimer);
171 }
172
173 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE)
174 {
175 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
176 sprintf(text1, "%s", "GAME OVER");
177 x = 100;
178 y = 400;
179 gameState = STATE_PRESSED_GAME_OVER;
180 al_start_timer(gameOverTimer);
181 }
182
183 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
184 {
185 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
186 sprintf(text1, "%s", "GAME OVER");
187 x = 100;
188 y = 400;
189 gameState = STATE_PRESSED_GAME_OVER;
190 al_start_timer(gameOverTimer);
191 }
192
193 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
194 {
195 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
196 sprintf(text1, "%s", "GAME OVER");
197 x = 100;
198 y = 400;
199 gameState = STATE_PRESSED_GAME_OVER;
200 al_start_timer(gameOverTimer);
201 }
202
203 //DINO PULA O BURACO E COME A PLANTA
204 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
205 {
206 sprintf(text, "%s", "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.");
207 sprintf(text1, "%s", "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?");
208 x = 100;
209 y = 400;
210 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
211 }
212
213 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
214 {
215 sprintf(text, "%s", "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO");
216 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
217 x = 100;
218 y = 400;
219 gameState = STATE_PRESSED_SONO_CORRE;
220 }
221
222 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
223 {
224 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.");
225 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
226 x = 100;
227 y = 400;
228 gameState = STATE_PRESSED_SONO_DESCANSA;
229 }
230
231 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
232 {
233 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
234 sprintf(text1, "%s", "GAME OVER");
235 x = 100;
236 y = 400;
237 gameState = STATE_PRESSED_GAME_OVER;
238 al_start_timer(gameOverTimer);
239 }
240
241 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
242 {
243 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
244 sprintf(text1, "%s", "GAME OVER");
245 x = 100;
246 y = 400;
247 gameState = STATE_PRESSED_GAME_OVER;
248 al_start_timer(gameOverTimer);
249 }
250
251 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
252 {
253 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
254 sprintf(text1, "%s", "GAME OVER");
255 x = 100;
256 y = 400;
257 gameState = STATE_PRESSED_GAME_OVER;
258 al_start_timer(gameOverTimer);
259 }
260
261 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
262 {
263 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
264 sprintf(text1, "%s", "GAME OVER");
265 x = 100;
266 y = 400;
267 gameState = STATE_PRESSED_GAME_OVER;
268 al_start_timer(gameOverTimer);
269 }
270
271
272 // CAI NO BURACO
273 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
274 {
275 sprintf(text, "%s", "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
276 x = 100;
277 y = 400;
278 gameState = STATE_PRESSED_CAI_BURACO;
279 }
280
281 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
282 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
283 {
284 if(gameState == STATE_PRESSED_PULA_BURACO) //ELSE IF WE HAVE PRESSED A OR B...
285 {
286 sprintf(text, "%s", "APERTEI ENTER");
287 x = 100;
288 y = 400;
289 gameState = STATE_PRESSED_BURACO; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
290 }
291 }
292
293 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
294 {
295 break;
296 }
297 }
298
299 case ALLEGRO_EVENT_DISPLAY_CLOSE:
300 {
301 done = true;
302 break;
303 }
304 }
305
306 if(done)
307 break;
308
309 if(redraw && al_is_event_queue_empty(queue))
310 {
311 al_clear_to_color(al_map_rgb(0, 0, 0));
312 al_draw_text(font, al_map_rgb(255, 255, 255), x, y, 0, text);
313
314 if(gameState == STATE_PRESSED_GAME_OVER)
315 {
316 al_draw_text(font, al_map_rgb(255, 255, 255), 500, 500, 0, text1);
317 }
318
319 al_flip_display();
320
321 redraw = false;
322 }
323
324 }
325
326 al_destroy_font(font);
327 al_destroy_display(disp);
328 al_destroy_timer(timer);
329 al_destroy_event_queue(queue);
330
331 return 0;
332}
---------------------------------------------------- |
Edgar Reynaldo
Major Reynaldo
May 2007
|
If you want to get fancy, and a little more advanced, try looking at allegro's event queue's. You can emit custom events, and then check for them too. You can even write "Scenes" instead of "States". Each scene would have its own state, and its own input and display routines. I use them all the time in my own games to transition from one state to another. But that way they are encapsulated in their own class and cannot be messed up by another state (usually). 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 |
Dizzy Egg
Member #10,824
March 2009
|
I agree; I also think it would be prudent to look into functions, start seperating out some of that code, make chunks easier to deal with, and keep that main loop nice and minimal. We'll see how this goes, it's quite hard to learn Allegro/games programming alongside learning how to structure code etc. But keep on keeping on, you'll get your first game out of it, and then you'll be unstoppable
---------------------------------------------------- |
mayna azevedo
Member #20,077
May 2021
|
Hello again. I went to test the font part, so I downloaded a file and changed it according to the code that you modified. However, it generated an error: reference not set to "al_init_ttf_addon" https://1drv.ms/u/s!Ak2pOptPmINYpmSnMMu1oG8rDSEY?e=oIianF I got the file from this site: https://www.fontsquirrel.com/fonts/list/popular I use Linux, and I'm doing everything for the terminal. To compile the file, I am using the following command: gcc dino_allegro_1.c -o dino_allegro_1 $ (pkg-config allegro-5 allegro_font-5 allegro_image-5 allegro_primitives-5 allegro_audio-5 allegro_acodec-5 --libs --cflags) Can you signal what I'm doing wrong? The code I modified is below: 3#include <stdio.h>
4#include <stdlib.h>
5#include <allegro5/allegro5.h>
6#include <allegro5/allegro_font.h>
7#include <allegro5/allegro_image.h>
8#include <allegro5/allegro_audio.h> // biblioteca de som
9#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
10#include <allegro5/allegro_ttf.h> //NEED FOR TTF FONTS
11
12//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
13#define STATE_START 1
14#define STATE_PRESSED_BURACO 2
15#define STATE_PRESSED_PULA_BURACO 3
16#define STATE_PRESSED_CAI_BURACO 4
17#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
18#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
19#define STATE_PRESSED_MACHUCADO_CORRE 7
20#define STATE_PRESSED_MACHUCADO_DESCANSA 8
21#define STATE_PRESSED_GAME_OVER 9
22#define STATE_PRESSED_SONO_CORRE 10
23#define STATE_PRESSED_SONO_DESCANSA 11
24#define STATE_PRESSED_CAI_BURACO_AJUDA 12
25#define STATE_PRESSED_CAI_BURACO_CORRE 13
26#define STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO 14
27#define STATE_PRESSED_CAI_BURACO_CAVANDO 15
28#define STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE 16
29#define STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA 17
30#define STATE_CORRE 18
31#define STATE_ABRIGO 19
32
33int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
34
35
36char text[255] = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
37char text1[255] = " ";
38
39void must_init(bool test, const char *description){
40 if(test) return;
41
42 printf("couldn't initialize %s\n", description);
43 exit(1);
44}
45
46int main(){
47 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
48 must_init(al_install_keyboard(), "keyboard");
49 must_init(al_install_mouse(), "mouse"); // instalando o mouse
50
51 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
52 must_init(timer, "timer");
53
54 ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer will last 3 seconds
55 must_init(gameOverTimer, "gameOverTimer");
56
57 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
58 must_init(queue, "queue");
59
60 // Permite que as formas e linhas tenham maior definição, deixar mais suave
61 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
62 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
63 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
64
65 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
66 must_init(disp, "display");
67
68 //ALLEGRO_FONT* font = al_create_builtin_font();
69 must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
70 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
71 ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
72
73 must_init(al_init_image_addon(), "image addon");
74
75 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
76
77 al_start_timer(timer);
78 al_register_event_source(queue, al_get_keyboard_event_source());
79 al_register_event_source(queue, al_get_display_event_source(disp));
80 al_register_event_source(queue, al_get_timer_event_source(timer));
81 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
82
83 // imagens
84 must_init(al_init_image_addon(), "image addon");
85 ALLEGRO_BITMAP* dino_apresentacao = al_load_bitmap("dino_apresentacao.png");
86 must_init(dino_apresentacao, "dino_apresentacao");
87
88 // adicionando o audio ao jogo
89 must_init(al_install_audio(), "audio");
90 must_init(al_init_acodec_addon(), "audio codecs");
91 must_init(al_reserve_samples(16), "reserve samples");
92
93 ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
94 must_init(music, "music");
95 al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
96 al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair, senão tem sai
97
98 bool done = false;
99 bool redraw = false;
100 ALLEGRO_EVENT event;
101
102 #define KEY_SEEN 1
103 #define KEY_RELEASED 2
104
105 unsigned char key[ALLEGRO_KEY_MAX];
106 memset(key, 0, sizeof(key));
107 al_hide_mouse_cursor(disp);
108
109
110
111 while(1){
112 al_wait_for_event(queue, &event);
113
114 switch(event.type)
115 {
116 case ALLEGRO_EVENT_TIMER:
117 {
118 redraw = true;
119
120 if(gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //IF STATE IS GAME OVER AND TIMER HAS TICKED AT LEAST ONCE...
121 {
122 sprintf(text, "%s", "RECOMEÇANDO O JOGO");
123 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
124
125 //RESET THE GAME OVER TIMER!
126 al_stop_timer(gameOverTimer);
127 al_set_timer_count(gameOverTimer, 0);
128 }
129
130 break;
131 }
132
133 case ALLEGRO_EVENT_KEY_CHAR:
134 {
135 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
136 {
137 sprintf(text, "%s", "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!");
138 sprintf(text1, "%s", "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?");
139 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
140
141 }
142 // PULA BURACO
143 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO)
144 {
145 sprintf(text, "%s", "DINO PULOU O BURACO, MAS MACHUCOU A PATINHA!!! ");
146 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?");
147 gameState = STATE_PRESSED_PULA_BURACO;
148 }
149
150 // DINO PULA BURACO E CORRE
151 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO)
152 {
153 sprintf(text, "%s", "DINO, MESMO MACHUCADO, CONTINUOU CORRENDO. ENTRETANTO, ESTÁ CORRENDO MUITO DEVAGAR!");
154 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR PARA SARAR A PATINHA (B)?");
155 gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
156 }
157
158 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
159 {
160 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MAS SUA VELOCIDADE AINDA É BAIXA. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!");
161 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
162 gameState = STATE_PRESSED_MACHUCADO_CORRE;
163 }
164
165 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
166 {
167 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO!");
168 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
169 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
170 }
171
172 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
173 {
174 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
175 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
176 gameState = STATE_CORRE;
177 }
178
179 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE)
180 {
181 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM ABRIGO)");
182 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
183 gameState = STATE_ABRIGO;
184 }
185
186 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
187 {
188 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
189 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRERENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
190 gameState = STATE_CORRE;
191 }
192
193 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
194 {
195 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
196 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
197 gameState = STATE_ABRIGO;
198 }
199
200 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_CORRE)
201 {
202 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
203 sprintf(text1, "%s", "GAME OVER");
204 gameState = STATE_PRESSED_GAME_OVER;
205 }
206
207 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_CORRE)
208 {
209 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
210 sprintf(text1, "%s", "GAME OVER");
211 gameState = STATE_PRESSED_GAME_OVER;
212 }
213
214 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_ABRIGO)
215 {
216 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
217 sprintf(text1, "%s", "GAME OVER");
218 gameState = STATE_PRESSED_GAME_OVER;
219 }
220
221 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_ABRIGO)
222 {
223 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
224 sprintf(text1, "%s", "GAME OVER");
225 gameState = STATE_PRESSED_GAME_OVER;
226 }
227
228 //DINO PULA O BURACO E COME A PLANTA
229 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
230 {
231 sprintf(text, "%s", "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.");
232 sprintf(text1, "%s", "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?");
233 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
234 }
235
236 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
237 {
238 sprintf(text, "%s", "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO");
239 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
240 gameState = STATE_PRESSED_SONO_CORRE;
241 }
242
243 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
244 {
245 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.");
246 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
247 gameState = STATE_PRESSED_SONO_DESCANSA;
248 }
249
250 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
251 {
252 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
253 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
254 gameState = STATE_CORRE;
255 }
256
257 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
258 {
259 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
260 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
261 gameState = STATE_ABRIGO;
262 }
263
264 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
265 {
266 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
267 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
268 gameState = STATE_CORRE;
269 }
270
271 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
272 {
273 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
274 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
275 gameState = STATE_ABRIGO;
276 }
277
278
279 // CAI NO BURACO
280 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
281 {
282 sprintf(text, "%s", "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
283 gameState = STATE_PRESSED_CAI_BURACO;
284 }
285
286 // CAI BURACO SAI COM AJUDA
287 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO)
288 {
289 sprintf(text, "%s", "DINO PEDIU AJUDA, MAS DEMOROU MUITO PARA AJUDA-LO, E PERDEU MUITO TEMPO. ");
290 sprintf(text1, "%s", "DINO DEVE CORRER NORMALMENTE (A) OU CORRER O MAIS RÁPIDO POSSIVEL (B)?");
291 gameState = STATE_PRESSED_CAI_BURACO_AJUDA;
292 }
293
294 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
295 {
296 sprintf(text, "%s", "DINO NÃO ESTÁ CORRENDO RÁPIDO O SUFICIENTE, E O METEORO ESTÁ SE APROXIMANDO. ");
297 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
298 gameState = STATE_PRESSED_CAI_BURACO_CORRE;
299 }
300
301 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
302 {
303 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
304 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
305 gameState = STATE_CORRE;
306 }
307
308 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
309 {
310 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
311 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
312 gameState = STATE_ABRIGO;
313 }
314
315 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
316 {
317 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
318 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
319 gameState = STATE_CORRE;
320 }
321
322 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
323 {
324 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
325 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
326 gameState = STATE_ABRIGO;
327 }
328
329 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
330 {
331 sprintf(text, "%s", "DINO ESTAVA CORRENDO MUITO RÁPIDO, E ACABOU TROPEÇANDO E CAINDO. COM ISSO, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO ");
332 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
333 gameState = STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO;
334 }
335
336 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
337 {
338 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
339 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
340 gameState = STATE_CORRE;
341 }
342
343 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
344 {
345 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
346 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
347 gameState = STATE_ABRIGO;
348 }
349
350 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
351 {
352 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
353 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
354 gameState = STATE_CORRE;
355 }
356
357 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
358 {
359 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
360 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
361 gameState = STATE_ABRIGO;
362 }
363
364 // CAI BURACO SAI CAVANDO
365 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO)
366 {
367 sprintf(text, "%s", "DINO SAIU DO BURACO CAVANDO, MAS AGORA ESTÁ COM SEDE.");
368 sprintf(text1, "%s", "DINO DEVE IGNORAR A SEDE E COMEÇAR A CORRER (A) OU BEBER ÁGUA (B)?");
369 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO;
370 }
371
372 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
373 {
374 sprintf(text, "%s", "DINO COMEÇAR A CORRER COM SEDE, E ISSO O DEIXA MUITO LENTO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
375 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
376 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE;
377 }
378
379 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
380 {
381 sprintf(text, "%s", "DINO VAI BEBER ÁGUA, MAS PERDE MUITO TEMPO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
382 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
383 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA;
384 }
385
386 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
387 {
388 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
389 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
390 gameState = STATE_CORRE;
391 }
392
393 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
394 {
395 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
396 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
397 gameState = STATE_ABRIGO;
398 }
399
400 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
401 {
402 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
403 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
404 gameState = STATE_CORRE;
405 }
406
407 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
408 {
409 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
410 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
411 gameState = STATE_ABRIGO;
412 }
413
414
415
416
417 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
418 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
419 {
420 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
421 {
422 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
423 sprintf(text, "%s", "PRESSIONE ENTER PARA COMEÇAR O JOGO");
424 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
425 }
426
427 else if(gameState == STATE_PRESSED_GAME_OVER) //ELSE IF WE HAVE PRESSED A OR B...
428 {
429 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
430 sprintf(text, "%s", "PARA JOGAR NOVAMENTE, APERTE O BOTÃO DE ESPAÇO");
431 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
432 }
433 }
434
435 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
436 {
437 break;
438 }
439 }
440
441 case ALLEGRO_EVENT_DISPLAY_CLOSE:
442 {
443 done = true;
444 break;
445 }
446 }
447
448 if(done)
449 break;
450
451 if(redraw && al_is_event_queue_empty(queue))
452 {
453 al_clear_to_color(al_map_rgb(0, 0, 0));
454 al_draw_text(font, al_map_rgb(255, 255, 255), 100, 500, 0, text);
455 al_draw_text(font, al_map_rgb(255, 255, 255), 300, 550, 0, text1);
456 al_flip_display();
457
458 redraw = false;
459 }
460
461 }
462
463 al_destroy_bitmap(dino_apresentacao);
464 al_destroy_font(font);
465 al_destroy_display(disp);
466 al_destroy_audio_stream(music);
467 al_destroy_timer(timer);
468 al_destroy_event_queue(queue);
469
470 return 0;
471}
Many thanks |
DanielH
Member #934
January 2001
|
Are you also linking the ttf addon library? Sorry, I don't use Linux, so not exactly sure. There are 2 libraries: allegro_font & allegro_ttf You have this line twice enums vs defines for game states? Also why so many else ifs? condense some of that. Use switch statements or a separate function if a is pressed vs b is pressed. 1if (keypressed)
2{
3if (key_enter){}
4
5if (key_a) gamestate = a_was_pressed(gamestate);
6if (key_b) gamestate = b_was_pressed(gamestate);
7}
8
9int a_was_pressed(int gamestate)
10{
11 switch (gamestate)
12 {
13 case STATE_PRESSED_BURACO:
14 return STATE_PRESSED_PULA_BURACO;
15
16 case STATE_PRESSED_PULA_BURACO: return STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
17
18///... etc
19
20
21 }
22
23 return gamestate;
24}
also, since you are hard coding your text, why not do something like this? char *text = "PRESSIONE ENTER PARA COMEÇAR O JOGO"; char *text1 = ""; //later in code switch from this sprintf(text, "%s", "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!"); sprintf(text1, "%s", "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?"); // to this text = "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!"; text1 = "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?";
|
mayna azevedo
Member #20,077
May 2021
|
@DanielH, I removed the second line: must_init(al_init_image_addon(), "image addon"); You ask about all the if(), soooo... I really don't know what I am doing, so I did the logic based on what the great @Dizzy Egg explain to me, and work. It may not be the most beautiful, but it works. But the font is not working, it give the follow error: 2jogo_dino_allegro.c: In function main:
3jogo_dino_allegro.c:79:19: error: redefinition of font
4 79 | ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
5 | ^~~~
6jogo_dino_allegro.c:76:19: note: previous definition of font was here
7 76 | ALLEGRO_FONT* font = al_create_builtin_font();
8 | ^~~~
The part to return to begining of the game is not work. The complete code: 3#include <stdio.h>
4#include <stdlib.h>
5#include <allegro5/allegro5.h>
6#include <allegro5/allegro_font.h>
7#include <allegro5/allegro_image.h>
8#include <allegro5/allegro_audio.h> // biblioteca de som
9#include <allegro5/allegro_acodec.h>
10#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
11#include <allegro5/allegro_ttf.h> //NEED FOR TTF FONTS
12
13//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
14#define STATE_START 1
15#define STATE_PRESSED_BURACO 2
16#define STATE_PRESSED_PULA_BURACO 3
17#define STATE_PRESSED_CAI_BURACO 4
18#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
19#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
20#define STATE_PRESSED_MACHUCADO_CORRE 7
21#define STATE_PRESSED_MACHUCADO_DESCANSA 8
22#define STATE_PRESSED_GAME_OVER 9
23#define STATE_PRESSED_SONO_CORRE 10
24#define STATE_PRESSED_SONO_DESCANSA 11
25#define STATE_PRESSED_CAI_BURACO_AJUDA 12
26#define STATE_PRESSED_CAI_BURACO_CORRE 13
27#define STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO 14
28#define STATE_PRESSED_CAI_BURACO_CAVANDO 15
29#define STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE 16
30#define STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA 17
31#define STATE_CORRE 18
32#define STATE_ABRIGO 19
33
34int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
35
36
37char text[255] = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
38char text1[255] = " ";
39
40void must_init(bool test, const char *description){
41 if(test) return;
42
43 printf("couldn't initialize %s\n", description);
44 exit(1);
45}
46
47int main(){
48 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
49 must_init(al_install_keyboard(), "keyboard");
50 must_init(al_install_mouse(), "mouse"); // instalando o mouse
51
52 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
53 must_init(timer, "timer");
54
55 ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer will last 3 seconds
56 must_init(gameOverTimer, "gameOverTimer");
57
58 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
59 must_init(queue, "queue");
60
61 // Permite que as formas e linhas tenham maior definição, deixar mais suave
62 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
63 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
64 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
65
66 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
67 must_init(disp, "display");
68
69 // add novo
70 /*
71 ALLEGRO_FONT* font = al_create_builtin_font();
72 must_init(font, "font");
73
74 ALLEGRO_FONT* font1 = al_create_builtin_font();
75 must_init(font1, "font1");
76 */
77
78 ALLEGRO_FONT* font = al_create_builtin_font();
79 must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
80 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
81 ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
82
83 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
84
85 al_start_timer(timer);
86 al_register_event_source(queue, al_get_keyboard_event_source());
87 al_register_event_source(queue, al_get_display_event_source(disp));
88 al_register_event_source(queue, al_get_timer_event_source(timer));
89 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
90
91 // imagens
92 must_init(al_init_image_addon(), "image addon");
93 ALLEGRO_BITMAP* dino_apresentacao = al_load_bitmap("dino_apresentacao.png");
94 must_init(dino_apresentacao, "dino_apresentacao");
95
96 // adicionando o audio ao jogo
97 must_init(al_install_audio(), "audio");
98 must_init(al_init_acodec_addon(), "audio codecs");
99 must_init(al_reserve_samples(16), "reserve samples");
100
101 // para música longa
102 ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
103 must_init(music, "music");
104 al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
105 al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair, senão tem sai
106
107 bool done = false;
108 bool redraw = false;
109 ALLEGRO_EVENT event;
110
111 #define KEY_SEEN 1
112 #define KEY_RELEASED 2
113
114 unsigned char key[ALLEGRO_KEY_MAX];
115 memset(key, 0, sizeof(key));
116 al_hide_mouse_cursor(disp);
117
118
119
120 while(1){
121 al_wait_for_event(queue, &event);
122
123 switch(event.type)
124 {
125 case ALLEGRO_EVENT_TIMER:
126 {
127 redraw = true;
128
129 if(gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //IF STATE IS GAME OVER AND TIMER HAS TICKED AT LEAST ONCE...
130 {
131 sprintf(text, "%s", "RECOMEÇANDO O JOGO");
132 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
133
134 //RESET THE GAME OVER TIMER!
135 al_stop_timer(gameOverTimer);
136 al_set_timer_count(gameOverTimer, 0);
137 }
138
139 break;
140 }
141
142 case ALLEGRO_EVENT_KEY_CHAR:
143 {
144 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
145 {
146 sprintf(text, "%s", "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!");
147 sprintf(text1, "%s", "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?");
148 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
149
150 }
151 // PULA BURACO
152 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO)
153 {
154 sprintf(text, "%s", "DINO PULOU O BURACO, MAS MACHUCOU A PATINHA!!! ");
155 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?");
156 gameState = STATE_PRESSED_PULA_BURACO;
157 }
158
159 // DINO PULA BURACO E CORRE
160 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO)
161 {
162 sprintf(text, "%s", "DINO, MESMO MACHUCADO, CONTINUOU CORRENDO. ENTRETANTO, ESTÁ CORRENDO MUITO DEVAGAR!");
163 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR PARA SARAR A PATINHA (B)?");
164 gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
165 }
166
167 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
168 {
169 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MAS SUA VELOCIDADE AINDA É BAIXA. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!");
170 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
171 gameState = STATE_PRESSED_MACHUCADO_CORRE;
172 }
173
174 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
175 {
176 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO!");
177 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
178 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
179 }
180
181 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
182 {
183 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
184 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
185 gameState = STATE_CORRE;
186 }
187
188 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE)
189 {
190 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM ABRIGO)");
191 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
192 gameState = STATE_ABRIGO;
193 }
194
195 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
196 {
197 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
198 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRERENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
199 gameState = STATE_CORRE;
200 }
201
202 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
203 {
204 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
205 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
206 gameState = STATE_ABRIGO;
207 }
208
209 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_CORRE)
210 {
211 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
212 sprintf(text1, "%s", "GAME OVER");
213 gameState = STATE_PRESSED_GAME_OVER;
214 }
215
216 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_CORRE)
217 {
218 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
219 sprintf(text1, "%s", "GAME OVER");
220 gameState = STATE_PRESSED_GAME_OVER;
221 }
222
223 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_ABRIGO)
224 {
225 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
226 sprintf(text1, "%s", "GAME OVER");
227 gameState = STATE_PRESSED_GAME_OVER;
228 }
229
230 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_ABRIGO)
231 {
232 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
233 sprintf(text1, "%s", "GAME OVER");
234 gameState = STATE_PRESSED_GAME_OVER;
235 }
236
237 //DINO PULA O BURACO E COME A PLANTA
238 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
239 {
240 sprintf(text, "%s", "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.");
241 sprintf(text1, "%s", "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?");
242 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
243 }
244
245 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
246 {
247 sprintf(text, "%s", "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO");
248 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
249 gameState = STATE_PRESSED_SONO_CORRE;
250 }
251
252 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
253 {
254 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.");
255 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
256 gameState = STATE_PRESSED_SONO_DESCANSA;
257 }
258
259 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
260 {
261 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
262 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
263 gameState = STATE_CORRE;
264 }
265
266 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
267 {
268 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
269 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
270 gameState = STATE_ABRIGO;
271 }
272
273 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
274 {
275 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
276 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
277 gameState = STATE_CORRE;
278 }
279
280 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
281 {
282 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
283 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
284 gameState = STATE_ABRIGO;
285 }
286
287
288 // CAI NO BURACO
289 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
290 {
291 sprintf(text, "%s", "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
292 gameState = STATE_PRESSED_CAI_BURACO;
293 }
294
295 // CAI BURACO SAI COM AJUDA
296 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO)
297 {
298 sprintf(text, "%s", "DINO PEDIU AJUDA, MAS DEMOROU MUITO PARA AJUDA-LO, E PERDEU MUITO TEMPO. ");
299 sprintf(text1, "%s", "DINO DEVE CORRER NORMALMENTE (A) OU CORRER O MAIS RÁPIDO POSSIVEL (B)?");
300 gameState = STATE_PRESSED_CAI_BURACO_AJUDA;
301 }
302
303 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
304 {
305 sprintf(text, "%s", "DINO NÃO ESTÁ CORRENDO RÁPIDO O SUFICIENTE, E O METEORO ESTÁ SE APROXIMANDO. ");
306 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
307 gameState = STATE_PRESSED_CAI_BURACO_CORRE;
308 }
309
310 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
311 {
312 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
313 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
314 gameState = STATE_CORRE;
315 }
316
317 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
318 {
319 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
320 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
321 gameState = STATE_ABRIGO;
322 }
323
324 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
325 {
326 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
327 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
328 gameState = STATE_CORRE;
329 }
330
331 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
332 {
333 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
334 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
335 gameState = STATE_ABRIGO;
336 }
337
338 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
339 {
340 sprintf(text, "%s", "DINO ESTAVA CORRENDO MUITO RÁPIDO, E ACABOU TROPEÇANDO E CAINDO. COM ISSO, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO ");
341 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
342 gameState = STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO;
343 }
344
345 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
346 {
347 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
348 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
349 gameState = STATE_CORRE;
350 }
351
352 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
353 {
354 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
355 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
356 gameState = STATE_ABRIGO;
357 }
358
359 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
360 {
361 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
362 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
363 gameState = STATE_CORRE;
364 }
365
366 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
367 {
368 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
369 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
370 gameState = STATE_ABRIGO;
371 }
372
373 // CAI BURACO SAI CAVANDO
374 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO)
375 {
376 sprintf(text, "%s", "DINO SAIU DO BURACO CAVANDO, MAS AGORA ESTÁ COM SEDE.");
377 sprintf(text1, "%s", "DINO DEVE IGNORAR A SEDE E COMEÇAR A CORRER (A) OU BEBER ÁGUA (B)?");
378 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO;
379 }
380
381 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
382 {
383 sprintf(text, "%s", "DINO COMEÇAR A CORRER COM SEDE, E ISSO O DEIXA MUITO LENTO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
384 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
385 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE;
386 }
387
388 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
389 {
390 sprintf(text, "%s", "DINO VAI BEBER ÁGUA, MAS PERDE MUITO TEMPO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
391 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
392 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA;
393 }
394
395 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
396 {
397 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
398 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
399 gameState = STATE_CORRE;
400 }
401
402 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
403 {
404 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
405 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
406 gameState = STATE_ABRIGO;
407 }
408
409 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
410 {
411 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
412 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
413 gameState = STATE_CORRE;
414 }
415
416 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
417 {
418 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
419 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
420 gameState = STATE_ABRIGO;
421 }
422
423
424
425
426 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
427 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
428 {
429 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
430 {
431 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
432 sprintf(text, "%s", "PRESSIONE ENTER PARA COMEÇAR O JOGO");
433 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
434 }
435
436 else if(gameState == STATE_PRESSED_GAME_OVER) //ELSE IF WE HAVE PRESSED A OR B...
437 {
438 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
439 sprintf(text, "%s", "PARA JOGAR NOVAMENTE, APERTE O BOTÃO DE ESPAÇO");
440 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
441 }
442 }
443
444 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
445 {
446 break;
447 }
448 }
449
450 case ALLEGRO_EVENT_DISPLAY_CLOSE:
451 {
452 done = true;
453 break;
454 }
455 }
456
457 if(done)
458 break;
459
460 if(redraw && al_is_event_queue_empty(queue))
461 {
462 al_clear_to_color(al_map_rgb(0, 0, 0));
463 al_draw_text(font, al_map_rgb(255, 255, 255), 100, 500, 0, text);
464 al_draw_text(font, al_map_rgb(255, 255, 255), 300, 550, 0, text1);
465 al_flip_display();
466
467 redraw = false;
468 }
469
470 }
471
472 al_destroy_bitmap(dino_apresentacao);
473 al_destroy_font(font);
474 al_destroy_display(disp);
475 al_destroy_audio_stream(music);
476 al_destroy_timer(timer);
477 al_destroy_event_queue(queue);
478
479 return 0;
480}
Thanks soooooo much. |
DanielH
Member #934
January 2001
|
//ALLEGRO_FONT* font = al_create_builtin_font(); must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST! must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE You are defining font twice. Lose the first one. mayna azevedo said: The part to return to begining of the game is not work. Not sure what you mean by this? return to beginning when? When game over, you stop timer, but reset it to 0. why reset it if it is stopped? Are should you not stop it, but reset it 0? Look at this. 1 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
2 {
3 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
4 {
5 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
6 sprintf(text, "%s", "PRESSIONE ENTER PARA COMEÇAR O JOGO");
7 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
8 }
9
10 else if(gameState == STATE_PRESSED_GAME_OVER) //ELSE IF WE HAVE PRESSED A OR B...
11 {
12 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
13 sprintf(text, "%s", "PARA JOGAR NOVAMENTE, APERTE O BOTÃO DE ESPAÇO");
14 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
15 }
16 }
This part: |
mayna azevedo
Member #20,077
May 2021
|
I have to remove only the first line? 1//ALLEGRO_FONT* font = al_create_builtin_font();
2 //must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
3 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
4 ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
It gave the follow error: 2reference not set to "al_init_ttf_addon"
3reference not set to "al_load_ttf_font"
Do I have to add a new library? At the end of the game, I would like the player to have the option to play again 3#include <stdio.h>
4#include <stdlib.h>
5#include <allegro5/allegro5.h>
6#include <allegro5/allegro_font.h>
7#include <allegro5/allegro_image.h>
8#include <allegro5/allegro_audio.h> // biblioteca de som
9#include <allegro5/allegro_acodec.h>
10#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
11#include <allegro5/allegro_ttf.h> //NEED FOR TTF FONTS
12
13//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
14#define STATE_START 1
15#define STATE_PRESSED_BURACO 2
16#define STATE_PRESSED_PULA_BURACO 3
17#define STATE_PRESSED_CAI_BURACO 4
18#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
19#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
20#define STATE_PRESSED_MACHUCADO_CORRE 7
21#define STATE_PRESSED_MACHUCADO_DESCANSA 8
22#define STATE_PRESSED_GAME_OVER 9
23#define STATE_PRESSED_SONO_CORRE 10
24#define STATE_PRESSED_SONO_DESCANSA 11
25#define STATE_PRESSED_CAI_BURACO_AJUDA 12
26#define STATE_PRESSED_CAI_BURACO_CORRE 13
27#define STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO 14
28#define STATE_PRESSED_CAI_BURACO_CAVANDO 15
29#define STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE 16
30#define STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA 17
31#define STATE_CORRE 18
32#define STATE_ABRIGO 19
33
34int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
35
36
37char text[255] = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
38char text1[255] = " ";
39
40void must_init(bool test, const char *description){
41 if(test) return;
42
43 printf("couldn't initialize %s\n", description);
44 exit(1);
45}
46
47int main(){
48 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
49 must_init(al_install_keyboard(), "keyboard");
50 must_init(al_install_mouse(), "mouse"); // instalando o mouse
51
52 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
53 must_init(timer, "timer");
54
55 ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer will last 3 seconds
56 must_init(gameOverTimer, "gameOverTimer");
57
58 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
59 must_init(queue, "queue");
60
61 // Permite que as formas e linhas tenham maior definição, deixar mais suave
62 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
63 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
64 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
65
66 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
67 must_init(disp, "display");
68
69 // add novo
70 /*
71 ALLEGRO_FONT* font = al_create_builtin_font();
72 must_init(font, "font");
73
74 ALLEGRO_FONT* font1 = al_create_builtin_font();
75 must_init(font1, "font1");
76 */
77
78 //ALLEGRO_FONT* font = al_create_builtin_font();
79 //must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
80 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
81 ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
82
83 //al_init_font_addon();
84 //al_init_ttf_addon();
85
86 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
87
88 al_start_timer(timer);
89 al_register_event_source(queue, al_get_keyboard_event_source());
90 al_register_event_source(queue, al_get_display_event_source(disp));
91 al_register_event_source(queue, al_get_timer_event_source(timer));
92 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
93
94 // imagens
95 must_init(al_init_image_addon(), "image addon");
96 ALLEGRO_BITMAP* dino_apresentacao = al_load_bitmap("dino_apresentacao.png");
97 must_init(dino_apresentacao, "dino_apresentacao");
98
99 // adicionando o audio ao jogo
100 must_init(al_install_audio(), "audio");
101 must_init(al_init_acodec_addon(), "audio codecs");
102 must_init(al_reserve_samples(16), "reserve samples");
103
104 // para música longa
105 ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
106 must_init(music, "music");
107 al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
108 al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair, senão tem sai
109
110 bool done = false;
111 bool redraw = false;
112 ALLEGRO_EVENT event;
113
114 #define KEY_SEEN 1
115 #define KEY_RELEASED 2
116
117 unsigned char key[ALLEGRO_KEY_MAX];
118 memset(key, 0, sizeof(key));
119 al_hide_mouse_cursor(disp);
120
121
122
123 while(1){
124 al_wait_for_event(queue, &event);
125
126 switch(event.type)
127 {
128 case ALLEGRO_EVENT_TIMER:
129 {
130 redraw = true;
131
132 if(gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //IF STATE IS GAME OVER AND TIMER HAS TICKED AT LEAST ONCE...
133 {
134 sprintf(text, "%s", "RECOMEÇANDO O JOGO");
135 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
136
137 //RESET THE GAME OVER TIMER!
138 al_stop_timer(gameOverTimer);
139 al_set_timer_count(gameOverTimer, 0);
140 }
141
142 break;
143 }
144
145 case ALLEGRO_EVENT_KEY_CHAR:
146 {
147 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
148 {
149 sprintf(text, "%s", "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!");
150 sprintf(text1, "%s", "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?");
151 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
152
153 }
154 // PULA BURACO
155 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO)
156 {
157 sprintf(text, "%s", "DINO PULOU O BURACO, MAS MACHUCOU A PATINHA!!! ");
158 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?");
159 gameState = STATE_PRESSED_PULA_BURACO;
160 }
161
162 // DINO PULA BURACO E CORRE
163 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO)
164 {
165 sprintf(text, "%s", "DINO, MESMO MACHUCADO, CONTINUOU CORRENDO. ENTRETANTO, ESTÁ CORRENDO MUITO DEVAGAR!");
166 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR PARA SARAR A PATINHA (B)?");
167 gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
168 }
169
170 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
171 {
172 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MAS SUA VELOCIDADE AINDA É BAIXA. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!");
173 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
174 gameState = STATE_PRESSED_MACHUCADO_CORRE;
175 }
176
177 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
178 {
179 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO!");
180 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
181 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
182 }
183
184 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
185 {
186 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
187 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
188 gameState = STATE_CORRE;
189 }
190
191 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE)
192 {
193 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM ABRIGO)");
194 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
195 gameState = STATE_ABRIGO;
196 }
197
198 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
199 {
200 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
201 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRERENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
202 gameState = STATE_CORRE;
203 }
204
205 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
206 {
207 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
208 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
209 gameState = STATE_ABRIGO;
210 }
211
212 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_CORRE)
213 {
214 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
215 sprintf(text1, "%s", "GAME OVER");
216 gameState = STATE_PRESSED_GAME_OVER;
217 }
218
219 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_CORRE)
220 {
221 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
222 sprintf(text1, "%s", "GAME OVER");
223 gameState = STATE_PRESSED_GAME_OVER;
224 }
225
226 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_ABRIGO)
227 {
228 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
229 sprintf(text1, "%s", "GAME OVER");
230 gameState = STATE_PRESSED_GAME_OVER;
231 }
232
233 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_ABRIGO)
234 {
235 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
236 sprintf(text1, "%s", "GAME OVER");
237 gameState = STATE_PRESSED_GAME_OVER;
238 }
239
240 //DINO PULA O BURACO E COME A PLANTA
241 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
242 {
243 sprintf(text, "%s", "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.");
244 sprintf(text1, "%s", "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?");
245 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
246 }
247
248 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
249 {
250 sprintf(text, "%s", "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO");
251 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
252 gameState = STATE_PRESSED_SONO_CORRE;
253 }
254
255 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
256 {
257 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.");
258 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
259 gameState = STATE_PRESSED_SONO_DESCANSA;
260 }
261
262 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
263 {
264 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
265 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
266 gameState = STATE_CORRE;
267 }
268
269 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
270 {
271 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
272 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
273 gameState = STATE_ABRIGO;
274 }
275
276 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
277 {
278 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
279 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
280 gameState = STATE_CORRE;
281 }
282
283 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
284 {
285 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
286 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
287 gameState = STATE_ABRIGO;
288 }
289
290
291 // CAI NO BURACO
292 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
293 {
294 sprintf(text, "%s", "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
295 gameState = STATE_PRESSED_CAI_BURACO;
296 }
297
298 // CAI BURACO SAI COM AJUDA
299 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO)
300 {
301 sprintf(text, "%s", "DINO PEDIU AJUDA, MAS DEMOROU MUITO PARA AJUDA-LO, E PERDEU MUITO TEMPO. ");
302 sprintf(text1, "%s", "DINO DEVE CORRER NORMALMENTE (A) OU CORRER O MAIS RÁPIDO POSSIVEL (B)?");
303 gameState = STATE_PRESSED_CAI_BURACO_AJUDA;
304 }
305
306 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
307 {
308 sprintf(text, "%s", "DINO NÃO ESTÁ CORRENDO RÁPIDO O SUFICIENTE, E O METEORO ESTÁ SE APROXIMANDO. ");
309 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
310 gameState = STATE_PRESSED_CAI_BURACO_CORRE;
311 }
312
313 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
314 {
315 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
316 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
317 gameState = STATE_CORRE;
318 }
319
320 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
321 {
322 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
323 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
324 gameState = STATE_ABRIGO;
325 }
326
327 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
328 {
329 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
330 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
331 gameState = STATE_CORRE;
332 }
333
334 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
335 {
336 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
337 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
338 gameState = STATE_ABRIGO;
339 }
340
341 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
342 {
343 sprintf(text, "%s", "DINO ESTAVA CORRENDO MUITO RÁPIDO, E ACABOU TROPEÇANDO E CAINDO. COM ISSO, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO ");
344 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
345 gameState = STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO;
346 }
347
348 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
349 {
350 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
351 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
352 gameState = STATE_CORRE;
353 }
354
355 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
356 {
357 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
358 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
359 gameState = STATE_ABRIGO;
360 }
361
362 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
363 {
364 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
365 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
366 gameState = STATE_CORRE;
367 }
368
369 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
370 {
371 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
372 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
373 gameState = STATE_ABRIGO;
374 }
375
376 // CAI BURACO SAI CAVANDO
377 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO)
378 {
379 sprintf(text, "%s", "DINO SAIU DO BURACO CAVANDO, MAS AGORA ESTÁ COM SEDE.");
380 sprintf(text1, "%s", "DINO DEVE IGNORAR A SEDE E COMEÇAR A CORRER (A) OU BEBER ÁGUA (B)?");
381 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO;
382 }
383
384 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
385 {
386 sprintf(text, "%s", "DINO COMEÇAR A CORRER COM SEDE, E ISSO O DEIXA MUITO LENTO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
387 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
388 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE;
389 }
390
391 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
392 {
393 sprintf(text, "%s", "DINO VAI BEBER ÁGUA, MAS PERDE MUITO TEMPO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
394 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
395 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA;
396 }
397
398 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
399 {
400 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
401 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
402 gameState = STATE_CORRE;
403 }
404
405 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
406 {
407 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
408 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
409 gameState = STATE_ABRIGO;
410 }
411
412 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
413 {
414 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
415 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
416 gameState = STATE_CORRE;
417 }
418
419 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
420 {
421 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
422 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
423 gameState = STATE_ABRIGO;
424 }
425
426
427
428
429 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
430 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
431 {
432 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
433 {
434 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
435 sprintf(text, "%s", "PRESSIONE ENTER PARA COMEÇAR O JOGO");
436 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
437 }
438
439 else if(gameState == STATE_PRESSED_GAME_OVER) //ELSE IF WE HAVE PRESSED A OR B...
440 {
441 al_draw_bitmap(dino_apresentacao, 70, 100, 0);
442 sprintf(text, "%s", "PARA JOGAR NOVAMENTE, APERTE O BOTÃO DE ESPAÇO");
443 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
444 }
445 }
446
447 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
448 {
449 break;
450 }
451 }
452
453 case ALLEGRO_EVENT_DISPLAY_CLOSE:
454 {
455 done = true;
456 break;
457 }
458 }
459
460 if(done)
461 break;
462
463 if(redraw && al_is_event_queue_empty(queue))
464 {
465 al_clear_to_color(al_map_rgb(0, 0, 0));
466 al_draw_text(font, al_map_rgb(255, 255, 255), 100, 500, 0, text);
467 al_draw_text(font, al_map_rgb(255, 255, 255), 300, 550, 0, text1);
468 al_flip_display();
469
470 redraw = false;
471 }
472
473 }
474
475 al_destroy_bitmap(dino_apresentacao);
476 al_destroy_font(font);
477 al_destroy_display(disp);
478 al_destroy_audio_stream(music);
479 al_destroy_timer(timer);
480 al_destroy_event_queue(queue);
481
482 return 0;
483}
Thanks |
DanielH
Member #934
January 2001
|
Yes, there is an allegro_font library which you already included. If you want to use TTF fonts then you also need to link the allegro_ttf library. You need both lines must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST! must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS Just make sure you link both libraries I don't have your resources, but everything else seems to be working. Also, I don't speak Portuguese, so I don't know if it's working correctly. This is what I was talking about with split in to functions for a or b. A little easier to manage. I removed the wonky sprintf string copy code also 1#include <stdio.h>
2#include <stdlib.h>
3#include <allegro5/allegro5.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_image.h>
6#include <allegro5/allegro_audio.h> // biblioteca de som
7#include <allegro5/allegro_acodec.h>
8#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
9#include <allegro5/allegro_ttf.h> //NEED FOR TTF FONTS
10
11//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
12enum
13 {
14 STATE_START,
15 STATE_PRESSED_BURACO,
16 STATE_PRESSED_PULA_BURACO,
17 STATE_PRESSED_CAI_BURACO,
18 STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE,
19 STATE_PRESSED_SONO_DESCANSA_OU_CORRE,
20 STATE_PRESSED_MACHUCADO_CORRE,
21 STATE_PRESSED_MACHUCADO_DESCANSA,
22 STATE_PRESSED_GAME_OVER,
23 STATE_PRESSED_SONO_CORRE,
24 STATE_PRESSED_SONO_DESCANSA,
25 STATE_PRESSED_CAI_BURACO_AJUDA,
26 STATE_PRESSED_CAI_BURACO_CORRE,
27 STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO,
28 STATE_PRESSED_CAI_BURACO_CAVANDO,
29 STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE,
30 STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA,
31 STATE_CORRE,
32 STATE_ABRIGO
33};
34
35int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
36
37
38const char *text = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
39const char *text1 = "";
40
41void must_init(bool test, const char* description) {
42 if (test) return;
43
44 printf("couldn't initialize %s\n", description);
45 exit(1);
46}
47
48int pressed_a(int state)
49{
50 switch (state)
51 {
52 case STATE_START: //IF WE PRESS ENTER WHEN STATE IS "START"....
53 {
54 text = "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!";
55 text1 = "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?";
56 state = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
57 } break;
58
59 // PULA BURACO
60 case STATE_PRESSED_BURACO:
61 {
62 text = "DINO PULOU O BURACO, MAS MACHUCOU A PATINHA!!! ";
63 text1 = "DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?";
64 state = STATE_PRESSED_PULA_BURACO;
65 } break;
66
67 // DINO PULA BURACO E CORRE
68 case STATE_PRESSED_PULA_BURACO:
69 {
70 text = "DINO, MESMO MACHUCADO, CONTINUOU CORRENDO. ENTRETANTO, ESTÁ CORRENDO MUITO DEVAGAR!";
71 text1 = "DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR PARA SARAR A PATINHA (B)?";
72 state = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
73 } break;
74
75 // CAI BURACO SAI COM AJUDA
76 case STATE_PRESSED_CAI_BURACO:
77 {
78 text = "DINO PEDIU AJUDA, MAS DEMOROU MUITO PARA AJUDA-LO, E PERDEU MUITO TEMPO. ";
79 text1 = "DINO DEVE CORRER NORMALMENTE (A) OU CORRER O MAIS RÁPIDO POSSIVEL (B)?";
80 state = STATE_PRESSED_CAI_BURACO_AJUDA;
81 } break;
82
83 case STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE:
84 {
85 text = "DINO CONTINUOU CORRENDO, MAS SUA VELOCIDADE AINDA É BAIXA. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!";
86 text1 = "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?";
87 state = STATE_PRESSED_MACHUCADO_CORRE;
88 } break;
89
90 case STATE_PRESSED_SONO_DESCANSA_OU_CORRE:
91 {
92 text = "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO";
93 text1 = "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?";
94 state = STATE_PRESSED_SONO_CORRE;
95 } break;
96
97 case STATE_PRESSED_MACHUCADO_CORRE:
98 {
99 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
100 text1 = "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?";
101 state = STATE_CORRE;
102 } break;
103
104 case STATE_PRESSED_MACHUCADO_DESCANSA:
105 {
106 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
107 text1 = "DINO DEVE CONTINUAR CORRERENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?";
108 state = STATE_CORRE;
109 } break;
110
111 case STATE_PRESSED_SONO_CORRE:
112 {
113 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
114 text1 = "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
115 state = STATE_CORRE;
116 } break;
117
118 case STATE_PRESSED_SONO_DESCANSA:
119 {
120 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
121 text1 = "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
122 state = STATE_CORRE;
123 } break;
124
125
126 case STATE_PRESSED_CAI_BURACO_AJUDA:
127 {
128 text = "DINO NÃO ESTÁ CORRENDO RÁPIDO O SUFICIENTE, E O METEORO ESTÁ SE APROXIMANDO. ";
129 text1 = "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?";
130 state = STATE_PRESSED_CAI_BURACO_CORRE;
131 } break;
132
133 case STATE_PRESSED_CAI_BURACO_CORRE:
134 {
135 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
136 text1 = "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
137 state = STATE_CORRE;
138 } break;
139
140 case STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO:
141 {
142 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
143 text1 = "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
144 state = STATE_CORRE;
145 } break;
146
147 case STATE_PRESSED_CAI_BURACO_CAVANDO:
148 {
149 text = "DINO COMEÇAR A CORRER COM SEDE, E ISSO O DEIXA MUITO LENTO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.";
150 text1 = "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
151 state = STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE;
152 } break;
153
154 case STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE:
155 {
156 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
157 text1 = "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
158 state = STATE_CORRE;
159 } break;
160
161 case STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA:
162 {
163 text = "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)";
164 text1 = "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
165 state = STATE_CORRE;
166 } break;
167
168 case STATE_CORRE:
169 {
170 text = "VOCÊ MATOU O DINO!.";
171 text1 = "GAME OVER";
172 state = STATE_PRESSED_GAME_OVER;
173 } break;
174
175 case STATE_ABRIGO:
176 {
177 text = "VOCÊ MATOU O DINO!.";
178 text1 = "GAME OVER";
179 state = STATE_PRESSED_GAME_OVER;
180 } break;
181 }
182
183 return state;
184}
185
186int pressed_b(int state)
187{
188 switch (state)
189 {
190
191 case STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE:
192 {
193 text = "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO!";
194 text1 = "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
195 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
196 } break;
197
198 case STATE_PRESSED_MACHUCADO_CORRE:
199 {
200 text = "DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM ABRIGO)";
201 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
202 gameState = STATE_ABRIGO;
203 } break;
204
205 case STATE_PRESSED_MACHUCADO_DESCANSA:
206 {
207 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
208 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
209 gameState = STATE_ABRIGO;
210 } break;
211
212 case STATE_CORRE:
213 {
214 text = "VOCÊ MATOU O DINO!.";
215 text1 = "GAME OVER";
216 gameState = STATE_PRESSED_GAME_OVER;
217 } break;
218
219 case STATE_ABRIGO:
220 {
221 text = "VOCÊ MATOU O DINO!.";
222 text1 = "GAME OVER";
223 gameState = STATE_PRESSED_GAME_OVER;
224 } break;
225
226 //DINO PULA O BURACO E COME A PLANTA
227 case STATE_PRESSED_PULA_BURACO:
228 {
229 text = "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.";
230 text1 = "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?";
231 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
232 } break;
233
234 case STATE_PRESSED_SONO_DESCANSA_OU_CORRE:
235 {
236 text = "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.";
237 text1 = "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?";
238 gameState = STATE_PRESSED_SONO_DESCANSA;
239 } break;
240
241 case STATE_PRESSED_SONO_CORRE:
242 {
243 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
244 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
245 gameState = STATE_ABRIGO;
246 } break;
247
248 case STATE_PRESSED_SONO_DESCANSA:
249 {
250 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
251 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
252 gameState = STATE_ABRIGO;
253 } break;
254
255
256 // CAI NO BURACO
257 case STATE_PRESSED_BURACO:
258 {
259 text = "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?";
260 gameState = STATE_PRESSED_CAI_BURACO;
261 } break;
262
263 case STATE_PRESSED_CAI_BURACO_CORRE:
264 {
265 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
266 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
267 gameState = STATE_ABRIGO;
268 } break;
269
270 case STATE_PRESSED_CAI_BURACO_AJUDA:
271 {
272 text = "DINO ESTAVA CORRENDO MUITO RÁPIDO, E ACABOU TROPEÇANDO E CAINDO. COM ISSO, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO ";
273 text1 = "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?";
274 gameState = STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO;
275 } break;
276
277 case STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO:
278 {
279 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
280 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
281 gameState = STATE_ABRIGO;
282 } break;
283
284 // CAI BURACO SAI CAVANDO
285 case STATE_PRESSED_CAI_BURACO:
286 {
287 text = "DINO SAIU DO BURACO CAVANDO, MAS AGORA ESTÁ COM SEDE.";
288 text1 = "DINO DEVE IGNORAR A SEDE E COMEÇAR A CORRER (A) OU BEBER ÁGUA (B)?";
289 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO;
290 } break;
291
292
293 case STATE_PRESSED_CAI_BURACO_CAVANDO:
294 {
295 text = "DINO VAI BEBER ÁGUA, MAS PERDE MUITO TEMPO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.";
296 text1 = "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?";
297 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA;
298 } break;
299
300 case STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE:
301 {
302 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
303 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
304 gameState = STATE_ABRIGO;
305 } break;
306
307
308 case STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA:
309 {
310 text = "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)";
311 text1 = "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?";
312 gameState = STATE_ABRIGO;
313 } break;
314 }
315
316 return state;
317}
318
319int main() {
320 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
321 must_init(al_install_keyboard(), "keyboard");
322 must_init(al_install_mouse(), "mouse"); // instalando o mouse
323
324 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
325 must_init(timer, "timer");
326
327 ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer will last 3 seconds
328 must_init(gameOverTimer, "gameOverTimer");
329
330 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
331 must_init(queue, "queue");
332
333 // Permite que as formas e linhas tenham maior definição, deixar mais suave
334 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
335 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
336 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
337
338 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
339 must_init(disp, "display");
340
341 must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
342 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
343 ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
344 //ALLEGRO_FONT* font = al_create_builtin_font();
345
346 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
347
348 al_start_timer(timer);
349 al_register_event_source(queue, al_get_keyboard_event_source());
350 al_register_event_source(queue, al_get_display_event_source(disp));
351 al_register_event_source(queue, al_get_timer_event_source(timer));
352 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
353
354 // imagens
355 must_init(al_init_image_addon(), "image addon");
356 ALLEGRO_BITMAP* dino_apresentacao = al_load_bitmap("dino_apresentacao.png");
357 must_init(dino_apresentacao, "dino_apresentacao");
358
359 // adicionando o audio ao jogo
360 must_init(al_install_audio(), "audio");
361 must_init(al_init_acodec_addon(), "audio codecs");
362 must_init(al_reserve_samples(16), "reserve samples");
363
364 // para música longa
365 ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
366 must_init(music, "music");
367 al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
368 al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair, senão tem sai
369
370 bool done = false;
371 bool redraw = false;
372 ALLEGRO_EVENT event;
373
374#define KEY_SEEN 1
375#define KEY_RELEASED 2
376
377 unsigned char key[ALLEGRO_KEY_MAX];
378 memset(key, 0, sizeof(key));
379 al_hide_mouse_cursor(disp);
380
381 while (1) {
382 al_wait_for_event(queue, &event);
383
384 switch (event.type)
385 {
386 case ALLEGRO_EVENT_TIMER:
387 {
388 redraw = true;
389
390 if (gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //IF STATE IS GAME OVER AND TIMER HAS TICKED AT LEAST ONCE...
391 {
392 text = "RECOMEÇANDO O JOGO";
393 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
394
395 //RESET THE GAME OVER TIMER!
396 //al_stop_timer(gameOverTimer);
397 al_set_timer_count(gameOverTimer, 0);
398 }
399 } break;
400
401 case ALLEGRO_EVENT_KEY_CHAR:
402 {
403 switch (event.keyboard.keycode)
404 {
405 case ALLEGRO_KEY_ENTER:
406 {
407 if (gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
408 {
409 text = "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!";
410 text1 = "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?";
411 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
412 }
413 } break;
414
415 case ALLEGRO_KEY_A:
416 {
417 gameState = pressed_a(gameState);
418 } break;
419
420 case ALLEGRO_KEY_B:
421 {
422 gameState = pressed_b(gameState);
423 } break;
424
425/*********************Need to clean up this***********/
426 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
427 case ALLEGRO_KEY_BACKSPACE:
428 {
429 if (gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
430 {
431 //al_draw_bitmap(dino_apresentacao, 70, 100, 0);
432 text = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
433 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
434 }
435
436 else if (gameState == STATE_PRESSED_GAME_OVER) //ELSE IF WE HAVE PRESSED A OR B...
437 {
438 //al_draw_bitmap(dino_apresentacao, 70, 100, 0);
439 text = "PARA JOGAR NOVAMENTE, APERTE O BOTÃO DE ESPAÇO";
440 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
441 }
442 } break;
443
444 case ALLEGRO_KEY_ESCAPE:
445 {
446 done = true;
447 } break;
448 }
449 } break;
450
451 case ALLEGRO_EVENT_DISPLAY_CLOSE:
452 {
453 done = true;
454 } break;
455 }
456
457 if (done)
458 break;
459
460 if (redraw && al_is_event_queue_empty(queue))
461 {
462 al_clear_to_color(al_map_rgb(0, 0, 0));
463 al_draw_text(font, al_map_rgb(255, 255, 255), 100, 500, 0, text);
464 al_draw_text(font, al_map_rgb(255, 255, 255), 300, 550, 0, text1);
465 al_flip_display();
466
467 redraw = false;
468 }
469
470 }
471
472 al_destroy_bitmap(dino_apresentacao);
473 al_destroy_font(font);
474 al_destroy_display(disp);
475 al_destroy_audio_stream(music);
476 al_destroy_timer(timer);
477 al_destroy_event_queue(queue);
478
479 return 0;
480}
|
mayna azevedo
Member #20,077
May 2021
|
Hello. Really cool what you did separete the A and B. But it's not working properly. For exemple, almost all the decision with B is not working, only A, and not always correctely. I will look with more attention. About the library, how do I link The loop in the game is not working too. You know how to correct it? Thanks again. |
DanielH
Member #934
January 2001
|
Yeah, I noticed that. Plus you had duplicate elseifs. Best bet would be to get a pencil and paper and workout the flowchart first. Then go through the code and make sure the states are correct? Draw it out with. make circle for each state. draw lines from state to state if you press A or B. If state _ and press key _ what is next state? I don't understand Portuguese to understand what is going on. google translate does help a little |
mayna azevedo
Member #20,077
May 2021
|
Okayyyyyyyyyyyyyyy, the last two question! (sorry, I have the sensation that will never end). So, I discovery, that in linux, we have to add allegro_font-5 to compile gcc jogo_dino_allegro.c -o jogo_dino_allegro $(pkg-config allegro-5 allegro_font-5 allegro_ttf-5 allegro_image-5 allegro_primitives-5 allegro_audio-5 allegro_acodec-5 --libs --cflags) So I change the code, But now all the letters disappear. The game will stay with the black window. 2must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
3ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
4ALLEGRO_FONT* font1 = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT);
5ALLEGRO_FONT* font2 = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT);
And another think: I put images in the code, but they appear quickly, in milliseconds. How do I make them stay on screen longer? See all the code and the files: 3#include <stdio.h>
4#include <stdlib.h>
5#include <allegro5/allegro5.h>
6#include <allegro5/allegro_font.h>
7#include <allegro5/allegro_image.h>
8#include <allegro5/allegro_audio.h> // biblioteca de som
9#include <allegro5/allegro_acodec.h>
10#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
11#include <allegro5/allegro_ttf.h> //NEED FOR TTF FONTS
12
13//HERE ARE THE GAME STATES, WE NEED TO KNOW WHAT "STATE" THE GAME IS IN...
14#define STATE_START 1
15#define STATE_PRESSED_BURACO 2
16#define STATE_PRESSED_PULA_BURACO 3
17#define STATE_PRESSED_CAI_BURACO 4
18#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
19#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
20#define STATE_PRESSED_MACHUCADO_CORRE 7
21#define STATE_PRESSED_MACHUCADO_DESCANSA 8
22#define STATE_PRESSED_GAME_OVER 9
23#define STATE_PRESSED_SONO_CORRE 10
24#define STATE_PRESSED_SONO_DESCANSA 11
25#define STATE_PRESSED_CAI_BURACO_AJUDA 12
26#define STATE_PRESSED_CAI_BURACO_CORRE 13
27#define STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO 14
28#define STATE_PRESSED_CAI_BURACO_CAVANDO 15
29#define STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE 16
30#define STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA 17
31#define STATE_CORRE 18
32#define STATE_ABRIGO 19
33
34int gameState = STATE_START; //HERE IS OUR STARTING STATE, WE CAN CHANGE THIS TO USE IN OUR "IF"
35
36
37char text[255] = "PRESSIONE ENTER PARA COMEÇAR O JOGO";
38char text1[255] = " ";
39char text2[255] = "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @";
40
41void must_init(bool test, const char *description){
42 if(test) return;
43
44 printf("couldn't initialize %s\n", description);
45 exit(1);
46}
47
48int main(){
49 must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
50 must_init(al_install_keyboard(), "keyboard");
51 must_init(al_install_mouse(), "mouse"); // instalando o mouse
52
53 ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
54 must_init(timer, "timer");
55
56 ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer will last 3 seconds
57 must_init(gameOverTimer, "gameOverTimer");
58
59 ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
60 must_init(queue, "queue");
61
62 // Permite que as formas e linhas tenham maior definição, deixar mais suave
63 al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
64 al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
65 al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave
66
67 ALLEGRO_DISPLAY* disp = al_create_display(1200, 800);
68 must_init(disp, "display");
69
70 // add novo
71 /*
72 ALLEGRO_FONT* font = al_create_builtin_font();
73 must_init(font, "font");
74
75 ALLEGRO_FONT* font1 = al_create_builtin_font();
76 must_init(font1, "font1");
77
78 ALLEGRO_FONT* font2 = al_create_builtin_font();
79 must_init(font1, "font2");
80 */
81
82
83 //ALLEGRO_FONT* font = al_create_builtin_font();
84 //must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
85 must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
86 ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
87 ALLEGRO_FONT* font1 = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT);
88 ALLEGRO_FONT* font2 = al_load_ttf_font("Antonio-Bold.ttf", 14, ALLEGRO_ALIGN_LEFT);
89
90 //al_init_font_addon();
91 //al_init_ttf_addon();
92
93 must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código
94
95 al_start_timer(timer);
96 al_register_event_source(queue, al_get_keyboard_event_source());
97 al_register_event_source(queue, al_get_display_event_source(disp));
98 al_register_event_source(queue, al_get_timer_event_source(timer));
99 al_register_event_source(queue, al_get_mouse_event_source()); // adicionado para o mouse funcionar
100
101 // imagens
102 must_init(al_init_image_addon(), "image addon");
103 ALLEGRO_BITMAP* apresentacao = al_load_bitmap("apresentacao.png");
104 must_init(apresentacao, "apresentacao");
105
106 // adicionando o audio ao jogo
107 must_init(al_install_audio(), "audio");
108 must_init(al_init_acodec_addon(), "audio codecs");
109 must_init(al_reserve_samples(16), "reserve samples");
110
111 // para música longa
112 ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
113 must_init(music, "music");
114 al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
115 al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair, senão tem sai
116
117 bool done = false;
118 bool redraw = false;
119 ALLEGRO_EVENT event;
120
121 #define KEY_SEEN 1
122 #define KEY_RELEASED 2
123
124 unsigned char key[ALLEGRO_KEY_MAX];
125 memset(key, 0, sizeof(key));
126 al_hide_mouse_cursor(disp);
127
128
129
130 while(1){
131 al_wait_for_event(queue, &event);
132
133 switch(event.type)
134 {
135 case ALLEGRO_EVENT_TIMER:
136 {
137 redraw = true;
138
139 if(gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //IF STATE IS GAME OVER AND TIMER HAS TICKED AT LEAST ONCE...
140 {
141 sprintf(text, "%s", "RECOMEÇANDO O JOGO");
142 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
143
144 //RESET THE GAME OVER TIMER!
145 al_stop_timer(gameOverTimer);
146 al_set_timer_count(gameOverTimer, 0);
147 }
148
149 break;
150 }
151
152 case ALLEGRO_EVENT_KEY_CHAR:
153 {
154 if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START) //IF WE PRESS ENTER WHEN STATE IS "START"....
155 {
156 al_draw_bitmap(apresentacao, 100, 100, 0);
157 sprintf(text, "%s", "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!");
158 sprintf(text1, "%s", "DINO PULAR O BURACO (A) OU IGNORAR O BURACO (B)?");
159 sprintf(text2, "%s", "");
160 al_flip_display();
161 redraw = false;
162 gameState = STATE_PRESSED_BURACO; //...NOW WE CHANGE STATE TO "PRESSED ENTER"
163
164 }
165 // PULA BURACO
166 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO)
167 {
168 sprintf(text, "%s", "DINO PULOU O BURACO, MAS MACHUCOU A PATINHA!!! ");
169 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL (B)?");
170 gameState = STATE_PRESSED_PULA_BURACO;
171 }
172
173 // DINO PULA BURACO E CORRE
174 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO)
175 {
176 sprintf(text, "%s", "DINO, MESMO MACHUCADO, CONTINUOU CORRENDO. ENTRETANTO, ESTÁ CORRENDO MUITO DEVAGAR!");
177 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR PARA SARAR A PATINHA (B)?");
178 gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
179 }
180
181 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
182 {
183 sprintf(text, "%s", "DINO CONTINUOU CORRENDO, MAS SUA VELOCIDADE AINDA É BAIXA. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!");
184 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
185 gameState = STATE_PRESSED_MACHUCADO_CORRE;
186 }
187
188 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
189 {
190 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO!");
191 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
192 gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
193 }
194
195 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
196 {
197 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
198 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
199 gameState = STATE_CORRE;
200 }
201
202 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE)
203 {
204 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM ABRIGO)");
205 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
206 gameState = STATE_ABRIGO;
207 }
208
209 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
210 {
211 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
212 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRERENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
213 gameState = STATE_CORRE;
214 }
215
216 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
217 {
218 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
219 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
220 gameState = STATE_ABRIGO;
221 }
222
223 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_CORRE)
224 {
225 sprintf(text, "%s", "VOCÊ MATOU O DINO!");
226 sprintf(text1, "%s", "GAME OVER! JOGAR NOVAMENTE (S)?");
227 gameState = STATE_PRESSED_GAME_OVER;
228 }
229
230 else if(event.keyboard.keycode == ALLEGRO_KEY_S && gameState == STATE_PRESSED_GAME_OVER)
231 {
232 sprintf(text, "%s", "RECOMEÇA");
233 sprintf(text1, "%s", "ENTER");
234 gameState = STATE_START;
235 }
236
237
238 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_CORRE)
239 {
240 sprintf(text, "%s", "VOCÊ MATOU O DINO!.");
241 sprintf(text1, "%s", "GAME OVER! JOGAR NOVAMENTE?");
242 gameState = STATE_PRESSED_GAME_OVER;
243 }
244
245 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_ABRIGO)
246 {
247 sprintf(text, "%s", "VOCÊ MATOU O DINO!");
248 sprintf(text1, "%s", "GAME OVER! JOGAR NOVAMENTE (S)?");
249 gameState = STATE_PRESSED_GAME_OVER;
250 }
251
252 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_ABRIGO)
253 {
254 sprintf(text, "%s", "VOCÊ MATOU O DINO!");
255 sprintf(text1, "%s", "GAME OVER! JOGAR NOVAMENTE (S)?");
256 gameState = STATE_PRESSED_GAME_OVER;
257 }
258
259 //DINO PULA O BURACO E COME A PLANTA
260 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
261 {
262 sprintf(text, "%s", "DINO PAROU PARA COMER UMA PLANTA, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO FICOU COM SONO.");
263 sprintf(text1, "%s", "DINO DEVE COMEÇAR A CORRER (A) OU PARAR PARA DESCANSAR (B)?");
264 gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
265 }
266
267 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
268 {
269 sprintf(text, "%s", "DINO COMEÇAR A CORRER MESMO SONOLENTO, E FICA BEM DEVAGAR. ASSIM, PERDEU MUITO TEMPO E O COMETA ESTÁ PRÓXIMO");
270 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
271 gameState = STATE_PRESSED_SONO_CORRE;
272 }
273
274 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
275 {
276 sprintf(text, "%s", "DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO.");
277 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
278 gameState = STATE_PRESSED_SONO_DESCANSA;
279 }
280
281 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
282 {
283 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
284 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
285 gameState = STATE_CORRE;
286 }
287
288 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
289 {
290 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
291 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
292 gameState = STATE_ABRIGO;
293 }
294
295 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
296 {
297 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
298 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
299 gameState = STATE_CORRE;
300 }
301
302 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
303 {
304 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
305 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
306 gameState = STATE_ABRIGO;
307 }
308
309
310 // CAI NO BURACO
311 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
312 {
313 sprintf(text, "%s", "DINO NÃO PULOU, E CAIU NO BURACO. DINO DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
314 sprintf(text1, "%s", " ");
315 gameState = STATE_PRESSED_CAI_BURACO;
316 }
317
318 // CAI BURACO SAI COM AJUDA
319 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO)
320 {
321 sprintf(text, "%s", "DINO PEDIU AJUDA, MAS DEMOROU MUITO PARA AJUDA-LO, E PERDEU MUITO TEMPO. ");
322 sprintf(text1, "%s", "DINO DEVE CORRER NORMALMENTE (A) OU CORRER O MAIS RÁPIDO POSSIVEL (B)?");
323 gameState = STATE_PRESSED_CAI_BURACO_AJUDA;
324 }
325
326 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
327 {
328 sprintf(text, "%s", "DINO NÃO ESTÁ CORRENDO RÁPIDO O SUFICIENTE, E O METEORO ESTÁ SE APROXIMANDO. ");
329 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
330 gameState = STATE_PRESSED_CAI_BURACO_CORRE;
331 }
332
333 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
334 {
335 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
336 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
337 gameState = STATE_CORRE;
338 }
339
340 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
341 {
342 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
343 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
344 gameState = STATE_ABRIGO;
345 }
346
347 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
348 {
349 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
350 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
351 gameState = STATE_CORRE;
352 }
353
354 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
355 {
356 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
357 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
358 gameState = STATE_ABRIGO;
359 }
360
361 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
362 {
363 sprintf(text, "%s", "DINO ESTAVA CORRENDO MUITO RÁPIDO, E ACABOU TROPEÇANDO E CAINDO. COM ISSO, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO ");
364 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
365 gameState = STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO;
366 }
367
368 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
369 {
370 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
371 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
372 gameState = STATE_CORRE;
373 }
374
375 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
376 {
377 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
378 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
379 gameState = STATE_ABRIGO;
380 }
381
382 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
383 {
384 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
385 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
386 gameState = STATE_CORRE;
387 }
388
389 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
390 {
391 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
392 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
393 gameState = STATE_ABRIGO;
394 }
395
396 // CAI BURACO SAI CAVANDO
397 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO)
398 {
399 sprintf(text, "%s", "DINO SAIU DO BURACO CAVANDO, MAS AGORA ESTÁ COM SEDE.");
400 sprintf(text1, "%s", "DINO DEVE IGNORAR A SEDE E COMEÇAR A CORRER (A) OU BEBER ÁGUA (B)?");
401 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO;
402 }
403
404 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
405 {
406 sprintf(text, "%s", "DINO COMEÇAR A CORRER COM SEDE, E ISSO O DEIXA MUITO LENTO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
407 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
408 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE;
409 }
410
411 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
412 {
413 sprintf(text, "%s", "DINO VAI BEBER ÁGUA, MAS PERDE MUITO TEMPO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
414 sprintf(text1, "%s", "DINO DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
415 gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA;
416 }
417
418 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
419 {
420 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
421 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
422 gameState = STATE_CORRE;
423 }
424
425 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
426 {
427 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
428 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
429 gameState = STATE_ABRIGO;
430 }
431
432 else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
433 {
434 sprintf(text, "%s", "DINO CONTINUAR CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO! (IMAGEM CORRENDO)");
435 sprintf(text1, "%s", "DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
436 gameState = STATE_CORRE;
437 }
438
439 else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
440 {
441 sprintf(text, "%s", "DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO! (IMAGEM ABRIGO)");
442 sprintf(text1, "%s", "DINO DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
443 gameState = STATE_ABRIGO;
444 }
445
446
447
448
449 //HERE WE USE A SINLE KEY (BACKSPACE), AND THEN USE IF/ELSE TO DO DIFFERENT THINGS, DEPENDING ON THE STATE...
450 else if(event.keyboard.keycode == ALLEGRO_KEY_BACKSPACE)
451 {
452 if(gameState == STATE_PRESSED_GAME_OVER) //IF WE HAVE ONLY PRESSED ENTER...
453 {
454 al_draw_bitmap(apresentacao, 70, 100, 0);
455 sprintf(text, "%s", "PRESSIONE ENTER PARA COMEÇAR O JOGO");
456 //al_draw_text(font, al_map_rgb(255, 255, 255), 430, 750, 0, "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @");
457 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "START"
458 }
459
460 else if(gameState == STATE_PRESSED_GAME_OVER) //ELSE IF WE HAVE PRESSED A OR B...
461 {
462 al_draw_bitmap(apresentacao, 70, 100, 0);
463 sprintf(text, "%s", "PARA JOGAR NOVAMENTE, APERTE O BOTÃO DE ESPAÇO");
464 gameState = STATE_START; //...WE CHANGE GO BACK TO STATE "PRESSED ENTER"
465 }
466 }
467
468 if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
469 {
470 break;
471 }
472 }
473
474 case ALLEGRO_EVENT_DISPLAY_CLOSE:
475 {
476 done = true;
477 break;
478 }
479 }
480
481 if(done)
482 break;
483
484 if(redraw && al_is_event_queue_empty(queue))
485 {
486 al_clear_to_color(al_map_rgb(0, 0, 0));
487 al_draw_text(font, al_map_rgb(255, 255, 255), 200, 500, 0, text);
488 al_draw_text(font1, al_map_rgb(255, 255, 255), 400, 550, 0, text1);
489 al_draw_text(font2, al_map_rgb(255, 255, 255), 400, 650, 0, text2);
490 al_flip_display();
491
492 redraw = false;
493 }
494
495 }
496
497 al_destroy_bitmap(apresentacao);
498 al_destroy_font(font);
499 al_destroy_display(disp);
500 al_destroy_audio_stream(music);
501 al_destroy_timer(timer);
502 al_destroy_event_queue(queue);
503
504 return 0;
505}
Thanks again. You all go to heaven with teleportation. |
DanielH
Member #934
January 2001
|
Not exactly sure about the blank text. What I did see is that you commented out al_init_font_addon. You need to init both: must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST! must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS Are you sure the font is loading correctly? It worked for me. I used a generic TTF font and the words were there. How about you get one font to work before trying 3. About the image disappearing quickly: Ideally you should separate ALL input from ALL logic from ALL drawing 1. process input You are drawing dino in the input section |
mayna azevedo
Member #20,077
May 2021
|
Hello. The font is working, thank you so much! |
Dizzy Egg
Member #10,824
March 2009
|
You only want to draw the image in the "draw" code, before you flip the display. You can use the gameState to see if you should draw the image: if(redraw && al_is_event_queue_empty(queue)) { al_clear_to_color(al_map_rgb(0, 0, 0)); al_draw_text(font, al_map_rgb(255, 255, 255), 200, 500, 0, text); al_draw_text(font1, al_map_rgb(255, 255, 255), 400, 550, 0, text1); al_draw_text(font2, al_map_rgb(255, 255, 255), 400, 650, 0, text2); if(gameState == STATE_START) al_draw_bitmap(apresentacao, 70, 100, 0); al_flip_display(); redraw = false; } I have attached full source code for you.
---------------------------------------------------- |
mayna azevedo
Member #20,077
May 2021
|
Hi everyone! So, in the font, I adjust where the text will go in the windows with the lines 1if(redraw && al_is_event_queue_empty(queue))
2 {
3 al_clear_to_color(al_map_rgb(0, 0, 0));
4 al_draw_text(font, al_map_rgb(255, 255, 255), 200, 500, 0, text);
5 al_draw_text(font1, al_map_rgb(255, 255, 255), 400, 550, 0, text1);
6 al_draw_text(font2, al_map_rgb(255, 255, 255), 400, 650, 0, text2);
7
8 if(gameState == STATE_START)
9 al_draw_bitmap(apresentacao, 10, 50, 0);
10
11 al_flip_display();
12
13 redraw = false;
14}
But can I change in the lines sprintf(text, "%s", "DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR. LOGO A SUA FRENTE, DINO VÊ UM BURACO!"); ? I have a lot of different size for the lines, and like to change everyone manualy to be aesthetically more beautiful. Thanks all of you!!!! |
|
1
2
|