1. This forum is in read-only mode.

Question about Game Logic (allegro 5)

Discussion in 'Computers & Modding' started by vivo, Mar 23, 2012.

  1. vivo

    vivo Well-Known Member

    Code:
    #include <stdio.h>
    #include <allegro5/allegro.h>
     
    const float FPS = 60;
    const int SCREEN_W = 640;
    const int SCREEN_H = 480;
    const int BOUNCER_SIZE = 32;
     
    int main(int argc, char **argv){
       ALLEGRO_DISPLAY *display = NULL;
       ALLEGRO_EVENT_QUEUE *event_queue = NULL;
       ALLEGRO_TIMER *timer = NULL;
       ALLEGRO_BITMAP *bouncer = NULL;
       float bouncer_x = SCREEN_W / 2.0 - BOUNCER_SIZE / 2.0;
       float bouncer_y = SCREEN_H / 2.0 - BOUNCER_SIZE / 2.0;
       float bouncer_dx = -4.0, bouncer_dy = 4.0;
       bool redraw = true;
     
       if(!al_init()) {
          fprintf(stderr, "failed to initialize allegro!\n");
          return -1;
       }
     
       timer = al_create_timer(1.0 / FPS);
       if(!timer) {
          fprintf(stderr, "failed to create timer!\n");
          return -1;
       }
     
       display = al_create_display(SCREEN_W, SCREEN_H);
       if(!display) {
          fprintf(stderr, "failed to create display!\n");
          al_destroy_timer(timer);
          return -1;
       }
     
       bouncer = al_create_bitmap(BOUNCER_SIZE, BOUNCER_SIZE);
       if(!bouncer) {
          fprintf(stderr, "failed to create bouncer bitmap!\n");
          al_destroy_display(display);
          al_destroy_timer(timer);
          return -1;
       }
     
       al_set_target_bitmap(bouncer);
     
       al_clear_to_color(al_map_rgb(255, 0, 255));
     
       al_set_target_bitmap(al_get_backbuffer(display));
     
       event_queue = al_create_event_queue();
       if(!event_queue) {
          fprintf(stderr, "failed to create event_queue!\n");
          al_destroy_bitmap(bouncer);
          al_destroy_display(display);
          al_destroy_timer(timer);
          return -1;
       }
     
       al_register_event_source(event_queue, al_get_display_event_source(display));
     
       al_register_event_source(event_queue, al_get_timer_event_source(timer));
     
       al_clear_to_color(al_map_rgb(0,0,0));
     
       al_flip_display();
     
       al_start_timer(timer);
     
       while(1)
       {
          ALLEGRO_EVENT ev;
          al_wait_for_event(event_queue, &ev);
     
          if(ev.type == ALLEGRO_EVENT_TIMER) {
             if(bouncer_x < 0 || bouncer_x > SCREEN_W - BOUNCER_SIZE) {
                bouncer_dx = -bouncer_dx;
             }
     
             if(bouncer_y < 0 || bouncer_y > SCREEN_H - BOUNCER_SIZE) {
                bouncer_dy = -bouncer_dy;
             }
     
             bouncer_x += bouncer_dx;
             bouncer_y += bouncer_dy;
     
             redraw = true;
          }
          else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
             break;
          }
     
          if(redraw && al_is_event_queue_empty(event_queue)) {
             redraw = false;
     
             al_clear_to_color(al_map_rgb(0,0,0));
     
             al_draw_bitmap(bouncer, bouncer_x, bouncer_y, 0);
     
             al_flip_display();
          }
       }
     
       al_destroy_bitmap(bouncer);
       al_destroy_timer(timer);
       al_destroy_display(display);
       al_destroy_event_queue(event_queue);
     
       return 0;
    }
    Hello,

    I was wondering why you have to divide the screen size by 2.0? And why do you divide the bouncer by two? Thanks (allegro 5)

    Here is the tutorial link: http://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial/Bitmaps thanks
     
  2. will1008

    will1008 Well-Known Member

    I'm not sure if you'll still need the information, but here goes.
    Quite simple, actually. This basically sets the location of the bouncer to a position where its center would lie at the center of the screen.
    The center of the bouncer relative to its upper right corner (0, 0) would be (BOUNCER_SIZE / 2, BOUNCER_SIZE / 2).
    The center of the screen relative to its upper right corner would be (SCREEN_W/2, SCREEN_H/2);