void GameMgr::processInput() { ALLEGRO_EVENT evento; while (!al_is_event_queue_empty(fila_eventos)) { al_clear_to_color(al_map_rgb(0, 0, 0)); // Colorindo a janela de preto al_wait_for_event(fila_eventos, &evento); if (evento.type == ALLEGRO_EVENT_KEY_DOWN) { // uma tecla foi pressionada switch (evento.keyboard.keycode) { case ALLEGRO_KEY_UP: player->trocaDirecao(0); break; case ALLEGRO_KEY_DOWN: player->trocaDirecao(2); break; case ALLEGRO_KEY_LEFT: player->trocaDirecao(3); break; case ALLEGRO_KEY_RIGHT: player->trocaDirecao(1); break; case ALLEGRO_KEY_ENTER: if (evento.keyboard.modifiers | ALLEGRO_KEYMOD_ALT) { auto mode = al_get_display_flags(display); if (mode | ALLEGRO_WINDOWED) { al_set_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, true); } else { al_set_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, false); } } break; case ALLEGRO_KEY_Q: case ALLEGRO_KEY_ESCAPE: exit(0); } } else if (evento.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) { // click no mouse if (evento.mouse.x > 0 && evento.mouse.x < 20 && evento.mouse.y > 0 && evento.mouse.y < 20) // cordenadas do botao exit(0); } else if (evento.type == ALLEGRO_EVENT_DISPLAY_RESIZE) { al_acknowledge_resize(display); screen_width = al_get_display_width(display); screen_height = al_get_display_height(display); _redraw = true; } else if (evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { // click no mouse exit(0); } else if (evento.type == ALLEGRO_EVENT_TIMER) { if (evento.timer.source == draw_timer) _redraw = true; else if (evento.timer.source == logic_timer) _tick = true; } redraw(); } al_destroy_display(display); // Finaliza a janela }
static void run(void) { ALLEGRO_EVENT event; bool quit = false; while (!quit) { while (al_get_next_event(queue, &event)) { if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) quit = true; else if (event.type == ALLEGRO_EVENT_KEY_DOWN) { if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) quit = true; else if (event.keyboard.keycode == ALLEGRO_KEY_SPACE) { bool opp = !(al_get_display_flags(display) & ALLEGRO_FULLSCREEN_WINDOW); al_set_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, opp); redraw(); } else if (event.keyboard.keycode == ALLEGRO_KEY_ENTER) { big = !big; if (big) al_resize_display(display, 800, 600); else al_resize_display(display, 640, 480); redraw(); } } } /* FIXME: Lazy timing */ al_rest(0.02); redraw(); } }
static SCM set_game_fullscreen (SCM game_smob, SCM s_fullscreen) { Game *game = check_game (game_smob); bool fullscreen = scm_to_bool (s_fullscreen); al_set_display_flag (game->display, ALLEGRO_FULLSCREEN, fullscreen); return SCM_UNSPECIFIED; }
/* the main game function */ static int play_game() { ALLEGRO_TIMER *inc_counter; int gameover = 0; int cyclenum = 0; /* init */ score = 0; init_view(); init_player(); init_badguys(); init_bullets(); init_explode(); init_message(); #define TIMER_SPEED ALLEGRO_BPS_TO_SECS(30*(cyclenum+2)) inc_counter = al_create_timer(TIMER_SPEED); al_start_timer(inc_counter); while (!gameover) { /* move everyone */ while ((al_get_timer_count(inc_counter) > 0) && (!gameover)) { update_view(); update_bullets(); update_explode(); update_message(); if (update_badguys()) { if (advance_view()) { cyclenum++; al_set_timer_count(inc_counter, 0); lay_attack_wave(TRUE); advance_player(TRUE); } else { lay_attack_wave(FALSE); advance_player(FALSE); } } gameover = update_player(); al_set_timer_count(inc_counter, al_get_timer_count(inc_counter)-1); } /* take a screenshot? */ if (key[ALLEGRO_KEY_PRINTSCREEN]) { static int ss_count = 0; char fname[80]; sprintf(fname, "speed%03d.tga", ++ss_count); al_save_bitmap(fname, al_get_backbuffer(screen)); while (key[ALLEGRO_KEY_PRINTSCREEN]) poll_input_wait(); al_set_timer_count(inc_counter, 0); } /* toggle fullscreen window */ if (key[ALLEGRO_KEY_F]) { int flags = al_get_display_flags(screen); al_set_display_flag(screen, ALLEGRO_FULLSCREEN_WINDOW, !(flags & ALLEGRO_FULLSCREEN_WINDOW)); while (key[ALLEGRO_KEY_F]) poll_input_wait(); } /* draw everyone */ draw_view(); } /* cleanup */ al_destroy_timer(inc_counter); shutdown_view(); shutdown_player(); shutdown_badguys(); shutdown_bullets(); shutdown_explode(); shutdown_message(); if (gameover < 0) { sfx_ping(1); return FALSE; } return TRUE; }
int main(void) { initialize(); int nva = al_get_num_video_adapters(); assert(nva); ALLEGRO_MONITOR_INFO aminfo; al_get_monitor_info(0, &aminfo); screen_w = aminfo.x2 - aminfo.x1 + 1; screen_h = aminfo.y2 - aminfo.y1 + 1; ALLEGRO_DISPLAY *display = al_create_display(screen_w, screen_h); ALLEGRO_EVENT_QUEUE *evqueue = al_create_event_queue(); ALLEGRO_TIMER *fps_timer = al_create_timer(1.0 / 120.0); al_set_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, true); if (!display) { printf("Failed to create display!\n"); exit(EXIT_FAILURE); } al_register_event_source(evqueue, al_get_keyboard_event_source()); al_register_event_source(evqueue, al_get_mouse_event_source()); al_register_event_source(evqueue, al_get_display_event_source(display)); al_register_event_source(evqueue, al_get_timer_event_source(fps_timer)); al_start_timer(fps_timer); //////////////////////////////////////////////////////////////////////////////////////////////// // Local Variables //////////////////////////////////////////////////////////////////////////////////////////////// //#ifdef DEBUG float fps = 0, delta_time = 0, current_time = 0, last_time = al_get_time(); //#endif //DEBUG bool render = true, executing = true; unsigned int spawn_counter = 0; Assets* assets = new Assets(); Stage stage = Menu; Stats stats; Button *play = new Button("Play", assets->fnt_menu, screen_w / 2, 300, [&stage, &stats]() -> void { stage = Game; stats.start_time = al_get_time(); }), *leaderboard = new Button("Leaderboard", assets->fnt_menu, screen_w / 2, 400, [&stage]() -> void { stage = Leaderboard; }), *options = new Button("Options", assets->fnt_menu, screen_w / 2, 500, [&stage]() -> void { stage = Options; }), *quit = new Button("Quit", assets->fnt_menu, screen_w / 2, 600, [&executing]() -> void { executing = false; }); b2Vec2 gravity(0.0f, 0.0f); b2World world(gravity); Projectile *player = new Projectile(assets->png_player, &world, screen_w / 2, screen_h - 200); std::vector<Projectile*> Meteors; //////////////////////////////////////////////////////////////////////////////////////////////// // Game Loop //////////////////////////////////////////////////////////////////////////////////////////////// while (executing) { ALLEGRO_EVENT event; al_wait_for_event(evqueue, &event); //#ifdef DEBUG current_time = al_get_time(); delta_time = current_time - last_time; fps = 1/(delta_time); last_time = current_time; //#endif //DEBUG world.Step(delta_time, 8, 3); switch (event.type) { // HANDLE ALLEGRO EVENTS case ALLEGRO_EVENT_TIMER: render = true; if (stage == Game) spawn_counter++; break; case ALLEGRO_EVENT_DISPLAY_CLOSE: executing = false; break; case ALLEGRO_EVENT_KEY_DOWN: executing = event.keyboard.keycode != ALLEGRO_KEY_ESCAPE; switch(event.keyboard.keycode) { case ALLEGRO_KEY_A: case ALLEGRO_KEY_LEFT: if (stage == Game) player->Velocity.x = -5; break; case ALLEGRO_KEY_D: case ALLEGRO_KEY_RIGHT: if (stage == Game) player->Velocity.x = 5; break; } break; case ALLEGRO_EVENT_KEY_UP: if (stage == Game) { player->Velocity.x = 0; player->Velocity.y = 0; } break; default: break; } switch (stage) { // UPDATE case Menu: play->Update(&event); leaderboard->Update(&event); options->Update(&event); quit->Update(&event); break; case Game: if (player->m_body->GetPosition().x < 1) player->m_body->SetTransform(b2Vec2(screen_w - 2, player->m_body->GetPosition().y), 0); if (player->m_body->GetPosition().x > screen_w - 1) player->m_body->SetTransform(b2Vec2(2, player->m_body->GetPosition().y), 0); if (spawn_counter > 75) { spawn_counter = 0; ALLEGRO_BITMAP *meteor_png; switch (rand() % 4) { // Size case 0: switch (rand() % 4) { // Selection case 0: meteor_png = rand() % 2 ? assets->png_meteor_brown_big1 : assets->png_meteor_grey_big1; break; case 1: meteor_png = rand() % 2 ? assets->png_meteor_brown_big2 : assets->png_meteor_grey_big2; break; case 2: meteor_png = rand() % 2 ? assets->png_meteor_brown_big3 : assets->png_meteor_grey_big3; break; case 3: meteor_png = rand() % 2 ? assets->png_meteor_brown_big4 : assets->png_meteor_grey_big4; break; default: break; } break; case 1: switch (rand() % 2) { // Selection case 0: meteor_png = rand() % 2 ? assets->png_meteor_brown_med1 : assets->png_meteor_grey_med1; break; case 1: meteor_png = rand() % 2 ? assets->png_meteor_brown_med2 : assets->png_meteor_grey_med2; break; default: break; } break; case 2: switch (rand() % 2) { // Selection case 0: meteor_png = rand() % 2 ? assets->png_meteor_brown_small1 : assets->png_meteor_grey_small1; break; case 1: meteor_png = rand() % 2 ? assets->png_meteor_brown_small2 : assets->png_meteor_grey_small2; break; default: break; } break; case 3: switch (rand() % 2) { // Selection case 0: meteor_png = rand() % 2 ? assets->png_meteor_brown_tiny1 : assets->png_meteor_grey_tiny1; break; case 1: meteor_png = rand() % 2 ? assets->png_meteor_brown_tiny2 : assets->png_meteor_grey_tiny2; break; default: break; } break; default: break; } auto it = Meteors.end(); Projectile *meteor = new Projectile(meteor_png, &world, rand() % screen_w, -75); meteor->Velocity = b2Vec2(-5 + (rand() % 10), rand() % 15); Meteors.insert(it, meteor); } for (std::vector<Projectile*>::iterator it = Meteors.begin(); it != Meteors.end(); ++it) { if (((*it)->m_body->GetPosition().x >= screen_w + 500 || (*it)->m_body->GetPosition().x <= -500) || ((*it)->m_body->GetPosition().y >= screen_h + 500 || (*it)->m_body->GetPosition().y <= -500) || (((*it)->m_body->GetTransform().p.x == 0.0) && (*it)->m_body->GetTransform().p.y == 0.0)) { delete *it; Meteors.erase(it); } } player->Update(&event); for (auto& x : Meteors) { x->Update(&event); } break; case Leaderboard: break; case Options: break; case End: break; default: break; } if (render && al_is_event_queue_empty(evqueue)) { render = false; al_clear_to_color(al_map_rgb(0, 0, 0)); al_set_target_bitmap(al_get_backbuffer(display)); for (float x = 0; x < screen_w; x += al_get_bitmap_width(assets->png_background)) { for (float y = 0; y < screen_h; y += al_get_bitmap_height(assets->png_background)) { al_draw_bitmap(assets->png_background, x, y, 0); } } #ifdef DEBUG //al_draw_textf(assets->fnt_menu, al_map_rgb(255, 0, 255), 10, 5, ALLEGRO_ALIGN_LEFT, "Debug"); //al_draw_textf(assets->fnt_menu, al_map_rgb(255, 0, 255), 10, 35, ALLEGRO_ALIGN_LEFT, "FPS: %i", (int)fps); //al_draw_textf(assets->fnt_menu, al_map_rgb(255, 0, 255), 10, 65, ALLEGRO_ALIGN_LEFT, "Meteor Count: %i", Meteors.size()); #endif // DEBUG switch (stage) { // RENDER default: break; case Menu: al_draw_text(assets->fnt_title, al_map_rgb(255, 255, 255), screen_w/2, 100, ALLEGRO_ALIGN_CENTRE, "SPACE SHOOTER III"); play->Render(); leaderboard->Render(); options->Render(); quit->Render(); break; case Game: player->Render(); for (auto& x : Meteors) { x->Render(); } break; case Leaderboard: break; case Options: break; case End: break; } al_flip_display(); } render = false; } //////////////////////////////////////////////////////////////////////////////////////////////// // Deinitialization //////////////////////////////////////////////////////////////////////////////////////////////// delete player; al_unregister_event_source(evqueue, al_get_keyboard_event_source()); al_unregister_event_source(evqueue, al_get_mouse_event_source()); al_unregister_event_source(evqueue, al_get_display_event_source(display)); al_unregister_event_source(evqueue, al_get_timer_event_source(fps_timer)); al_destroy_display(display); al_destroy_event_queue(evqueue); al_destroy_timer(fps_timer); delete assets; shutdown(); return EXIT_SUCCESS; }
int main(int argc, char **argv) { 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; (void)argc; (void)argv; if (!al_init()) { abort_example("Could not init Allegro.\n"); } al_install_mouse(); al_install_keyboard(); al_init_image_addon(); init_platform_specific(); al_set_new_display_flags(ALLEGRO_FRAMELESS); display = al_create_display(300, 200); if (!display) { abort_example("Error creating display\n"); } bitmap = al_load_bitmap("data/fakeamp.bmp"); if (!bitmap) { abort_example("Error loading fakeamp.bmp\n"); } timer = al_create_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) { al_set_display_flag(display, ALLEGRO_FRAMELESS, !(al_get_display_flags(display) & ALLEGRO_FRAMELESS)); } } 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_destroy_timer(timer); al_destroy_event_queue(events); al_destroy_display(display); return 0; }
void Gamestate_ProcessEvent(struct Game *game, struct MenuResources* data, ALLEGRO_EVENT *ev) { if ((data->menustate == MENUSTATE_ABOUT) && (ev->type == ALLEGRO_EVENT_KEY_DOWN)) { ChangeMenuState(game, data, MENUSTATE_MAIN); return; } if (ev->type != ALLEGRO_EVENT_KEY_DOWN) return; if (data->starting) return; if (ev->keyboard.keycode==ALLEGRO_KEY_UP) { data->selected--; if ((data->selected == 2) && ((data->menustate==MENUSTATE_VIDEO) || (data->menustate==MENUSTATE_OPTIONS) || (data->menustate==MENUSTATE_AUDIO))) { data->selected --; } if ((data->menustate==MENUSTATE_VIDEO) && (data->selected==1) && (data->options.fullscreen)) data->selected--; al_play_sample_instance(data->click); } else if (ev->keyboard.keycode==ALLEGRO_KEY_DOWN) { data->selected++; if ((data->menustate==MENUSTATE_VIDEO) && (data->selected==1) && (data->options.fullscreen)) data->selected++; if ((data->selected == 2) && ((data->menustate==MENUSTATE_VIDEO) || (data->menustate==MENUSTATE_OPTIONS) || (data->menustate==MENUSTATE_AUDIO))) { data->selected ++; } al_play_sample_instance(data->click); } if (ev->keyboard.keycode==ALLEGRO_KEY_ENTER) { char *text; al_play_sample_instance(data->click); switch (data->menustate) { case MENUSTATE_MAIN: switch (data->selected) { case 0: StartGame(game, data); break; case 1: ChangeMenuState(game,data,MENUSTATE_OPTIONS); break; case 2: ChangeMenuState(game,data,MENUSTATE_ABOUT); break; case 3: UnloadGamestate(game, "menu"); break; } break; case MENUSTATE_HIDDEN: ChangeMenuState(game,data,MENUSTATE_MAIN); break; case MENUSTATE_AUDIO: text = malloc(255*sizeof(char)); switch (data->selected) { case 0: game->config.music--; if (game->config.music<0) game->config.music=10; snprintf(text, 255, "%d", game->config.music); SetConfigOption(game, "SuperDerpy", "music", text); al_set_mixer_gain(game->audio.music, game->config.music/10.0); break; case 1: game->config.fx--; if (game->config.fx<0) game->config.fx=10; snprintf(text, 255, "%d", game->config.fx); SetConfigOption(game, "SuperDerpy", "fx", text); al_set_mixer_gain(game->audio.fx, game->config.fx/10.0); break; case 2: game->config.voice--; if (game->config.voice<0) game->config.voice=10; snprintf(text, 255, "%d", game->config.voice); SetConfigOption(game, "SuperDerpy", "voice", text); al_set_mixer_gain(game->audio.voice, game->config.voice/10.0); break; case 3: ChangeMenuState(game,data,MENUSTATE_OPTIONS); break; } free(text); break; case MENUSTATE_OPTIONS: switch (data->selected) { case 0: ChangeMenuState(game,data,MENUSTATE_VIDEO); break; case 1: ChangeMenuState(game,data,MENUSTATE_AUDIO); break; case 3: ChangeMenuState(game,data,MENUSTATE_MAIN); break; default: break; } break; case MENUSTATE_VIDEO: switch (data->selected) { case 0: data->options.fullscreen = !data->options.fullscreen; if (data->options.fullscreen) SetConfigOption(game, "SuperDerpy", "fullscreen", "1"); else SetConfigOption(game, "SuperDerpy", "fullscreen", "0"); al_set_display_flag(game->display, ALLEGRO_FULLSCREEN_WINDOW, data->options.fullscreen); SetupViewport(game); PrintConsole(game, "Fullscreen toggled"); break; case 1: data->options.resolution++; int max = 0, i = 0; for (i=0; i < al_get_num_video_adapters(); i++) { ALLEGRO_MONITOR_INFO aminfo; al_get_monitor_info(i , &aminfo); int desktop_width = aminfo.x2 - aminfo.x1 + 1; int desktop_height = aminfo.y2 - aminfo.y1 + 1; int localmax = desktop_width / 320; if (desktop_height / 180 < localmax) localmax = desktop_height / 180; if (localmax > max) max = localmax; } if (data->options.resolution > max) data->options.resolution = 1; text = malloc(255*sizeof(char)); snprintf(text, 255, "%d", data->options.resolution * 320); SetConfigOption(game, "SuperDerpy", "width", text); snprintf(text, 255, "%d", data->options.resolution * 180); SetConfigOption(game, "SuperDerpy", "height", text); free(text); al_resize_display(game->display, data->options.resolution * 320, data->options.resolution * 180); if ((al_get_display_width(game->display) < (data->options.resolution * 320)) || (al_get_display_height(game->display) < (data->options.resolution * 180))) { SetConfigOption(game, "SuperDerpy", "width", "320"); SetConfigOption(game, "SuperDerpy", "height", "180"); data->options.resolution = 1; al_resize_display(game->display, 320, 180); } SetupViewport(game); PrintConsole(game, "Resolution changed"); break; case 3: ChangeMenuState(game,data,MENUSTATE_OPTIONS); break; default: break; } break; case MENUSTATE_ABOUT: break; default: UnloadGamestate(game, "menu"); return; break; } } else if (ev->keyboard.keycode==ALLEGRO_KEY_ESCAPE) { switch (data->menustate) { case MENUSTATE_OPTIONS: ChangeMenuState(game,data,MENUSTATE_MAIN); break; case MENUSTATE_ABOUT: ChangeMenuState(game,data,MENUSTATE_MAIN); break; case MENUSTATE_HIDDEN: UnloadGamestate(game, "menu"); break; case MENUSTATE_VIDEO: ChangeMenuState(game,data,MENUSTATE_OPTIONS); break; case MENUSTATE_AUDIO: ChangeMenuState(game,data,MENUSTATE_OPTIONS); break; default: ChangeMenuState(game,data,MENUSTATE_HIDDEN); data->selected = -1; data->title_pos = 0; return; } } if (data->selected==-1) data->selected=3; if (data->selected==4) data->selected=0; return; }