Allegro.cc - Online Community

Allegro.cc Forums » Programming Questions » Screen is cleared and a new one appears Allegro5 in C?

Credits go to DanielH and Dizzy Egg for helping out!
This thread is locked; no one can reply to it. rss feed Print
 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:

#SelectExpand
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
avatar

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
workout logic
draw screen

Here is working code to get you started:

#SelectExpand
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}

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

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...

#SelectExpand
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
avatar

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:

#SelectExpand
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
work out logic
draw

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...

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

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 :'(.

#SelectExpand
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
avatar

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 ;D

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

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
#define STATE_START 1
#define STATE_PRESSED_ENTER 2
#define STATE_PRESSED_A_OR_B 3

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
#define STATE_HISTORY_2 5
...?

Thank you so much for your help, I don't know what I would do without it.

#SelectExpand
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
avatar

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
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
Draw screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
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
logic
draw screen

over and over and over again! Not:

Draw Screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
Draw screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
Draw Screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
Draw screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
Draw Screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
Draw screen
Do nothing until user presses a key
Decide on key pressed
Work out logic on key pressed
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...

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

mayna azevedo
Member #20,077
May 2021

Hi.

Can you explain this part better to me?

#SelectExpand
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!

#SelectExpand
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!!! ;D;)8-)

Dizzy Egg
Member #10,824
March 2009
avatar

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:

if(key == a && state = some_state_1)
else if(key == a && state == some_state_2)
else if(key == a && state == some_state_3)

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!

#SelectExpand
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}

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

Edgar Reynaldo
Major Reynaldo
May 2007
avatar

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).

Dizzy Egg
Member #10,824
March 2009
avatar

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

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

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:
The files I am using can be download in this link: https://1drv.ms/u/s!Ak2pOptPmINYpmN3Cnc1FrAnbgil?e=8pzBIq
The error: https://1drv.ms/u/s!Ak2pOptPmINYpmSnMMu1oG8rDSEY?e=85bZv4

#SelectExpand
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
avatar

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
must_init(al_init_image_addon(), "image addon");

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.

#SelectExpand
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:

#SelectExpand
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:

#SelectExpand
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
avatar

    //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.

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.

#SelectExpand
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:
if (gameState == STATE_PRESSED_GAME_OVER) else if (gameState == STATE_PRESSED_GAME_OVER)

mayna azevedo
Member #20,077
May 2021

I have to remove only the first line?

#SelectExpand
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:

#SelectExpand
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

#SelectExpand
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
avatar

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

#SelectExpand
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

#SelectExpand
1must_init(al_init_font_addon(), "font"); 2must_init(al_init_ttf_addon(), "ttf font");

The loop in the game is not working too. You know how to correct it?

Thanks again.

DanielH
Member #934
January 2001
avatar

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
Dino sees a meteor. A - Jump in hole, B - Ignore hole

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.

#SelectExpand
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:

#SelectExpand
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
avatar

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
2. do logic on current state and input
3. draw based on state

You are drawing dino in the input section
Then in the drawing portion you are clearing the screen.

mayna azevedo
Member #20,077
May 2021

Hello. The font is working, thank you so much!
But I don't understand about the image. Can you explain a little bit more?

Dizzy Egg
Member #10,824
March 2009
avatar

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.

----------------------------------------------------
Please check out my songs:
https://soundcloud.com/dont-rob-the-machina

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

#SelectExpand
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 


Go to: