Example #1
0
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();
			}
Example #2
0
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;
}
Example #3
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);
    }
}
Example #4
0
// 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;
}