int Pause_Keydown(struct Game *game, ALLEGRO_EVENT *ev) { if ((game->menu.menustate==MENUSTATE_OPTIONS) && ((ev->keyboard.keycode==ALLEGRO_KEY_ESCAPE) || ((ev->keyboard.keycode==ALLEGRO_KEY_ENTER) && (game->menu.selected==3)))) { al_play_sample_instance(game->menu.click); ChangeMenuState(game,MENUSTATE_PAUSE); } else if ((game->menu.menustate==MENUSTATE_VIDEO) && ((ev->keyboard.keycode==ALLEGRO_KEY_ESCAPE) || ((ev->keyboard.keycode==ALLEGRO_KEY_ENTER) && (game->menu.selected==3)))) { al_play_sample_instance(game->menu.click); ChangeMenuState(game,MENUSTATE_OPTIONS); if (game->menu.options.fullscreen!=game->fullscreen) { al_toggle_display_flag(game->display, ALLEGRO_FULLSCREEN_WINDOW, game->menu.options.fullscreen); al_clear_to_color(al_map_rgb(0,0,0)); al_flip_display(); game->fullscreen = game->menu.options.fullscreen; if (game->fullscreen) al_hide_mouse_cursor(game->display); else al_show_mouse_cursor(game->display); Shared_Unload(game); al_clear_to_color(al_map_rgb(0,0,0)); al_flip_display(); SetupViewport(game); Shared_Load(game); #ifndef __clang__ void Progress(struct Game *game, float p) { al_set_target_bitmap(al_get_backbuffer(game->display)); al_clear_to_color(al_map_rgb(0,0,0)); al_draw_text_with_shadow(game->font, al_map_rgb(255,255,255), game->viewportWidth*0.0234, game->viewportHeight*0.84, ALLEGRO_ALIGN_LEFT, "Loading..."); al_draw_filled_rectangle(0, game->viewportHeight*0.985, game->viewportWidth, game->viewportHeight, al_map_rgba(128,128,128,128)); al_draw_filled_rectangle(0, game->viewportHeight*0.985, p*game->viewportWidth, game->viewportHeight, al_map_rgba(255,255,255,255)); al_flip_display(); }
int main(void) { ALLEGRO_DISPLAY *display; ALLEGRO_BITMAP *bitmap; ALLEGRO_EVENT_QUEUE *events; ALLEGRO_EVENT event; bool down = false; int down_x = 0, down_y = 0; ALLEGRO_TIMER *timer; bool frame = false; if (!al_init()) { abort_example("Could not init Allegro.\n"); return 1; } al_install_mouse(); al_install_keyboard(); al_init_image_addon(); al_set_new_display_flags(ALLEGRO_NOFRAME); display = al_create_display(300, 200); bitmap = al_load_bitmap("data/fakeamp.bmp"); if (!bitmap) { abort_example("Error loading fakeamp.bmp\n\n"); return 1; } timer = al_install_timer(1.0f/30.0f); events = al_create_event_queue(); al_register_event_source(events, al_get_mouse_event_source()); al_register_event_source(events, al_get_keyboard_event_source()); al_register_event_source(events, al_get_display_event_source(display)); al_register_event_source(events, al_get_timer_event_source(timer)); al_start_timer(timer); for (;;) { al_wait_for_event(events, &event); if (event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) { if (event.mouse.button == 1 && event.mouse.x) { down = true; down_x = event.mouse.x; down_y = event.mouse.y; } if (event.mouse.button == 2) { frame = !frame; al_toggle_display_flag(ALLEGRO_NOFRAME, frame); } } else if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { break; } else if (event.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP) { if (event.mouse.button == 1) { down = false; } } else if (event.type == ALLEGRO_EVENT_MOUSE_AXES) { if (down) { int cx, cy; if (al_get_mouse_cursor_position(&cx, &cy)) { al_set_window_position(display, cx - down_x, cy - down_y); } } } else if (event.type == ALLEGRO_EVENT_KEY_DOWN && event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { break; } else if (event.type == ALLEGRO_EVENT_TIMER) { al_draw_bitmap(bitmap, 0, 0, 0); al_flip_display(); } } al_uninstall_timer(timer); al_destroy_event_queue(events); al_destroy_display(display); return 0; }
void engine_run(struct State *s) { int redraw = FALSE; if (engine_active) { return; } change_state(s, NULL); // Generate display events al_register_event_source(engine.event_queue, al_get_display_event_source(engine.display)); // Timer events al_register_event_source(engine.event_queue, al_get_timer_event_source(engine.timer)); // Keyboard events al_register_event_source(engine.event_queue, al_get_keyboard_event_source()); // Mouse events al_register_event_source(engine.event_queue, al_get_mouse_event_source()); al_start_timer(engine.timer); engine_active = TRUE; // Main game loop while (engine_active) { ALLEGRO_EVENT event; al_wait_for_event(engine.event_queue, &event); // Event processing engine.states[current_state]->_events(&event, &engine.sm); // If the close button was pressed... if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { engine_active = FALSE; break; } else if (event.type == ALLEGRO_EVENT_KEY_DOWN) { keys[event.keyboard.keycode] = TRUE; // F4 key will toggle full-screen if (event.keyboard.keycode == ALLEGRO_KEY_F4) { al_stop_timer(engine.timer); if (al_get_display_flags(engine.display) & ALLEGRO_FULLSCREEN_WINDOW) { al_toggle_display_flag(engine.display, ALLEGRO_FULLSCREEN_WINDOW, 0); } else { al_toggle_display_flag(engine.display, ALLEGRO_FULLSCREEN_WINDOW, 1); } aspect_ratio_transform(); al_start_timer(engine.timer); } } else if (event.type == ALLEGRO_EVENT_KEY_UP) { keys[event.keyboard.keycode] = FALSE; } else if (event.type == ALLEGRO_EVENT_TIMER) { engine.states[current_state]->_update(&engine.sm); redraw = TRUE; } if (redraw && engine_active && al_is_event_queue_empty(engine.event_queue)) { redraw = FALSE; if (MAINCONF->buffer) { al_set_target_bitmap(engine.buffer); } else { al_set_target_backbuffer(engine.display); } al_clear_to_color(engine.bg_color); engine.states[current_state]->_draw(&engine.sm); if (MAINCONF->buffer) { al_set_target_backbuffer(engine.display); al_clear_to_color(C_BLACK); al_draw_bitmap(engine.buffer, 0, 0, 0); } al_flip_display(); } } while (loaded_count > 0) { engine.loaded_states[--loaded_count]->_free(); } al_destroy_display(engine.display); al_destroy_timer(engine.timer); al_destroy_event_queue(engine.event_queue); al_destroy_font(font); if (MAINCONF->buffer) { al_destroy_bitmap(engine.buffer); } }
// Handles button events, may be called once every frame void* buttonhandler(BUTTONPTR button, void* data, int type) { typedef enum button_pressed { NONE, STARTB, HOWTOPLAYB, OPTIONSB, HIGHSCOREB, EXITB } BPRESSED; GDATAPTR game = (GDATAPTR)data; ALLEGRO_DISPLAY *display = game->display; static BPRESSED bpressed = NONE; if(strcmp(button->blabel, "STARTBUTTON") == 0 && type == BPRESSED_CALL) { game_start_init(); execute_on_button_press(); bpressed = STARTB; } if(strcmp(button->blabel, "HOWTOPLAYBUTTON") == 0 && type == BPRESSED_CALL) { execute_on_button_press(); bpressed = HOWTOPLAYB; } if(strcmp(button->blabel, "OPTIONSBUTTON") == 0 && type == BPRESSED_CALL) { execute_on_button_press(); bpressed = OPTIONSB; } if(strcmp(button->blabel, "HIGHSCOREBUTTON") == 0 && type == BPRESSED_CALL) { execute_on_button_press(); bpressed = HIGHSCOREB; } if(strcmp(button->blabel, "EXITBUTTON") == 0 && type == BPRESSED_CALL) { execute_on_button_press(); bpressed = EXITB; } if(strcmp(button->blabel, "FULLSCREEN") == 0 && type == BPRESSED_CALL) { (al_get_display_flags(display) & ALLEGRO_FULLSCREEN_WINDOW) ? al_toggle_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, false), al_resize_display(display, 800, 600) : al_toggle_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, true); if(strcmp(button->btext.text, "FULLSCREEN") == 0) button->btext.text = "WINDOWED"; else button->btext.text = "FULLSCREEN"; } if(strcmp(button->blabel, "FPS") == 0 && type == BPRESSED_CALL) { set_fps_status(!get_fps_status()); if(strcmp(button->btext.text, "FPS COUNTER: ON") == 0) button->btext.text = "FPS COUNTER: OFF"; else button->btext.text = "FPS COUNTER: ON"; } if(strcmp(button->blabel, "BACK") == 0 && type == BPRESSED_CALL) { return_to_main_menu(game); } if(strcmp(button->blabel, "RESUME") == 0 && type == BPRESSED_CALL) { exit_pause(game); mpressed = true; } if(strcmp(button->blabel, "EXITGAME") == 0 && type == BPRESSED_CALL) { game->exit = true; } if(strcmp(button->blabel, "QUITTOMENU") == 0 && type == BPRESSED_CALL) { return_to_main_menu(game); } if(strcmp(button->blabel, "QUITTOMENUGO") == 0 && type == BPRESSED_CALL) { return_to_main_menu(game); } if(strcmp(button->blabel, "CLEAR") == 0 && type == BPRESSED_CALL) { set_bflags_on_button(button, BLRELEASED); remove_bflags_on_button(button, BLPRESSED); remove_bflags_on_button(button, BVISIBLE); clear_highscores(); } if(type == CBANIMATION_CALL && (game->options || game->howtoplay || game->highscores || game->paused) && mpressed) { mpressed = false; if(game->paused) { pause_cleanup(); game->gamestarted = true; game->paused = false; } else { execute_on_M_press(); options_cleanup(); howtoplay_cleanup(); highscores_cleanup(); gameover_cleanup(); game->gamestarted = false; game->exit = false; game->options = false; game->highscores = false; game->howtoplay = false; } } if(type == CBANIMATION_CALL && bpressed != NONE) { BUTTONPTR currentptr, firstptr = get_first_element_from_button_list(); currentptr = search_button_list_for_element(&firstptr, "STARTBUTTON"); remove_bflags_on_button(currentptr, BVISIBLE); currentptr = search_button_list_for_element(&firstptr, "HOWTOPLAYBUTTON"); remove_bflags_on_button(currentptr, BVISIBLE); currentptr = search_button_list_for_element(&firstptr, "OPTIONSBUTTON"); remove_bflags_on_button(currentptr, BVISIBLE); currentptr = search_button_list_for_element(&firstptr, "HIGHSCOREBUTTON"); remove_bflags_on_button(currentptr, BVISIBLE); currentptr = search_button_list_for_element(&firstptr, "EXITBUTTON"); remove_bflags_on_button(currentptr, BVISIBLE); switch (bpressed) { case NONE: break; case STARTB: game->gamestarted = true; break; case HOWTOPLAYB: game->howtoplay = true; break; case OPTIONSB: game->options = true; break; case HIGHSCOREB: game->highscores = true; break; case EXITB: game->exit = true; break; default: bpressed = NONE; break; } bpressed = NONE; } return NULL; }