Esempio n. 1
0
void draw_rotating_ship(int *t,SDL_Event event){
    glPushMatrix();
    glTranslated(200,35,0);
    glPushMatrix();
    glRotated(30,1,1,0);
    glPushMatrix();
    glRotated(*t,0,0,0.2);*t+=2;
    if(event.motion.x>450 && event.motion.x<600 && event.motion.y>180 && event.motion.y<280)
        draw_ship({ship_color.x*2,ship_color.y*2,ship_color.z*2});
    else draw_ship(ship_color);
    glPopMatrix();
    glPopMatrix();
    glPopMatrix();

}
Esempio n. 2
0
void				check_arg(char **av, t_img *img, t_frac *frac)
{
	if (av[2])
		frac->max_iter = ft_atoi(av[2]);
	init_color(frac, av);
	if (ft_strequ(av[1], "mandel") == 1)
	{
		set_mandel(frac);
		draw_mandelbrot(img, frac);
	}
	else if (ft_strequ(av[1], "julia") == 1)
	{
		set_julia(frac);
		draw_julia(img, frac);
	}
	else if (ft_strequ(av[1], "ship") == 1)
	{
		set_ship(frac);
		draw_ship(img, frac);
	}
	else if (ft_strequ(av[1], "triangle") == 1)
	{
		set_triangle(frac);
		draw_sierpinski(img, frac);
	}
	else
		exit(0);
}
Esempio n. 3
0
void move_spaceship(Xuint8 *dir)
{
	erase_square(XPAR_VGA_PERIPH_MEM_0_S_AXI_MEM0_BASEADDR, spaceship_x, SHIP_Y);
	if(*dir == 0)
	{
		if(spaceship_x == MAX_SHIP_X)
		{
			spaceship_x--;
			*dir = 1;
		}
		else
			spaceship_x++;
	}
	else if(spaceship_x == MIN_SHIP_X)
	{
		spaceship_x++;
		*dir = 0;
	}
	else
		spaceship_x--;

	//Did new leftmost of rightmost part of ship hit a projectile
	if(ship_hit_projectile(spaceship_x-1) || ship_hit_projectile(spaceship_x+1))
	{
		if(--lives == 0)
			game_over = 1;
	}

	draw_ship(XPAR_VGA_PERIPH_MEM_0_S_AXI_MEM0_BASEADDR, spaceship_x, SHIP_Y);
}
Esempio n. 4
0
static void draw_game(void){
  draw_ship();
  draw_shots();
  draw_score();
  make_asteroids();
  detect_collitions();
  draw_environ();
}
Esempio n. 5
0
void draw_game(game *g) {
    int i;
    
    al_clear_to_color(BACKGROUND_COLOR);
    if(g->status == Pause || g->status == Win || g->status == Lose)
        draw_menu(g);
    else if(g->status == Config)
        draw_config(g);
    else if(g->status != Quit) {
        draw_ui(g);
        draw_ship(g);
        draw_shoots(g);
        draw_asteroids(g);
    }
}
Esempio n. 6
0
void draw_cubes_ship(double teta,int pause=0){
    glPushMatrix();
    glRotated(teta*0.4,1,0,0);
    for(int i=0;i<M;i++)
        for(int j=0;j<M;j++){
            if(!pause)T[i].pos[j].y+=teta*0.25;
            draw_cube(T[i].s[j],T[i].pos[j]);
        }

    glPopMatrix();
    glPushMatrix();
    glRotated(-teta*0.1,0,0,1);
    glRotated(teta*0.4,1,0,0);
    glTranslated(200,0,0);
    draw_ship(ship_color);
    glPopMatrix();

}
Esempio n. 7
0
static void
draw(struct game_state *gs)
{
	extern struct game_state *cur_state;
	extern struct game_state playback_state;

	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();

	set_modelview_matrix();

	if (!settings.static_settings || settings.static_settings->background)
		draw_level_background();

	if (cur_state != &playback_state &&
	  settings.control_type == CONTROL_HYBRID &&
	  ship_is_visible())
		draw_crosshair();

	if (inner_state.state != IS_LEVEL_CLEARED &&
	  inner_state.state != IS_LEVEL_TRANSITION &&
	  (inner_state.state != IS_WAVE_CLEARED ||
	  inner_state.tics < WAVE_CLEARED_TICS/2))
		draw_arena_outline(cur_arena, 1, cur_arena->border_type);

	draw_explosions();
	draw_particles();

	if (ship_is_visible()) {
		draw_ship();
		draw_missiles();
		draw_bombs();
		draw_lasers();
		draw_foes();
		draw_powerups();
	}

	draw_in_game_texts();
	draw_text();

	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
}
Esempio n. 8
0
void draw()
{
    clear_buffer(SDL_GetVideoSurface());
    draw_starfield(stars);
    draw_ship(ship);
}
Esempio n. 9
0
int main(int argc, char *argv[]) {

    int c;

    while((c = getopt(argc, argv, "hv")) != -1) {
        switch(c) {
        case 'h':
            puts(HELP);
            return 0;
        case 'v':
            printf("version %.1f\n", PROGRAM_VERSION);
            return 0;
        }
    }

    if(!al_init()) {
        fprintf(stderr, "failed to initialize allegro!\n");
        return -1;
    }

    if(argc == 2 && !strcmp(argv[1], "-v")) {
        printf("version %.1f\n", PROGRAM_VERSION);
        return 0;
    }

    bool key[5] = {false, false, false, false, false};
    bool doexit = false;
    bool redraw = true;

    timer = al_create_timer(1.0 / FPS);
    if(!timer) {
        fprintf(stderr, "couldn't initialize timer.\n");
        return -1;
    }

    display = al_create_display(SCREEN_W, SCREEN_H);
    if(!display) {
        fprintf(stderr, "failed to create the display.\n");
        al_destroy_timer(timer);

        return -1;
    }

    al_set_window_title(display, "blasteroids");

    al_init_primitives_addon();

    if(!al_install_keyboard()) {
        fprintf(stderr, "failed to initialize keyboard.\n");
        al_destroy_display(display);
        al_destroy_timer(timer);

        return -1;
    }

    /* Making the sky look like sky */

    colors[0] = al_map_rgba(255, 100, 255, 128);
    colors[1] = al_map_rgba(255, 100, 100, 255);
    colors[2] = al_map_rgba(100, 100, 255, 255);

    for (layer = 0; layer < 3; layer++) {
        for (star = 0; star < NUM_STARS/3; star++) {
            Point *p = &stars[layer][star];
            p->x = rand() % SCREEN_W;
            p->y = rand() % SCREEN_H;
        }
    }


    start = al_get_time() * 1000;
    now = start;
    elapsed = 0;
    frame_count = 0;
    program_start = al_get_time();


    /* done with the sky. Now making the ship. */
    Spaceship *ship = init_ship();
    List *a = (List *)summon_asteroids(NUMBER_ASTEROIDS);
    ListElmt *astElmt = list_head(a);


    if(!ship) {
        fprintf(stderr, "couldn't create bitmap.\n");
        al_destroy_timer(timer);
        al_destroy_display(display);
        return -1;
    }

    Blast *blast = init_blast(ship->sx, ship->sy, ship->heading);

    event_queue = al_create_event_queue();
    if(!event_queue) {
        fprintf(stderr, "failed to create event queue.\n");
        al_destroy_display(display);
        al_destroy_timer(timer);
        return -1;
    }

    al_register_event_source(event_queue, al_get_keyboard_event_source());
    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_start_timer(timer);

    while(!doexit) {
        /* animate the sky, just sky, starts, but NOT objects. */

        ALLEGRO_EVENT ev;
        al_wait_for_event(event_queue, &ev);

        if(ev.type == ALLEGRO_EVENT_TIMER) {

            if(key[UP])
                ship->speed += 0.04;

            if(key[RIGHT])
                ship->heading += 1.0f;

            if(key[DOWN])
                if(ship->speed > 0.05)
                    ship->speed -= 0.04;

            if(key[LEFT])
                ship->heading -= 1.0f;

            fly_ship(ship);
            // fire ze missile

            if(key[SPACE]) {
                blast->sx = ship->sx;
                blast->sy = ship->sy;
                blast->heading = ship->heading;
                blast->gone = 0;
            }

            float theta = head2theta(blast->heading);
            blast->sx += blast->speed * cos(theta);
            if(blast->sx <= 0 || blast->sx >= SCREEN_W) {
                blast->gone = 1;
            }

            blast->sy += blast->speed * sin(theta);
            if(blast->sy <= 0 || blast->sy >= SCREEN_H) {
                blast->gone = 1;
            }

            /* loop through the list of asteroids */

            astElmt = (astElmt->next)?astElmt->next : list_head(a);
            Asteroid *aster = astElmt->aster;

            /* asteroid eternity */
            if(aster->sx < 0 || aster->sx > SCREEN_W - 33)
                aster->sx = 0;

            if(aster->sy < 0 || aster->sy > SCREEN_H)
                aster->sy = 0;



            aster->twist += aster->rot_velocity;

            /* Fuzzy movement */
            if((int)aster->sx % 3 == 0)
                aster->sx += aster->speed;
            aster->sx += 0.9;
            if((int)aster->sy % 5 == 3)
                aster->sy += aster->speed;
            aster->sy += 0.9;

            aster->twist += 0.4;

            /* detect alteroid collision, but only if 5 seconds have
             passed since the last Death */

            Box s = {{ship->sx, ship->sy}, 16.0f, 20.0f};
            Box a = {{aster->sx, aster->sy}, 45.0f, 40.0f};

            if(ship->heading != -90.0f) {
                if(!aster->gone && !ship->gone && is_collision(&s, &a)) {
                    ship->color = al_map_rgb(0, 0, 255);
                }
            }

            /* detect asteroid being shot */

            Box b = {{blast->sx, blast->sy}, 120.0f, 3.0f};
            if(!(blast->gone) && !(aster->gone) && is_collision(&b, &a)) {
                aster->gone = 1;
            }
            redraw = true;
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) {

            switch(ev.keyboard.keycode) {
            case ALLEGRO_KEY_UP:
                key[UP] = true;
                break;
            case ALLEGRO_KEY_RIGHT:
                key[RIGHT] = true;
                break;
            case ALLEGRO_KEY_DOWN:
                key[DOWN] = true;
                break;
            case ALLEGRO_KEY_LEFT:
                key[LEFT] = true;
                break;
            case ALLEGRO_KEY_SPACE:
                key[SPACE] = true;
                break;
            }
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_UP) {
            switch(ev.keyboard.keycode) {
            case ALLEGRO_KEY_UP:
                key[UP] = false;
                break;
            case ALLEGRO_KEY_RIGHT:
                key[RIGHT] = false;
                break;
            case ALLEGRO_KEY_DOWN:
                key[DOWN] = false;
                break;
            case ALLEGRO_KEY_LEFT:
                key[LEFT] = false;
                break;
            case ALLEGRO_KEY_SPACE:
                key[SPACE] = false;
                break;
            case ALLEGRO_KEY_Q:
            case ALLEGRO_KEY_ESCAPE:
                doexit = true;
                break;
            }
        }

        if(redraw && al_is_event_queue_empty(event_queue)) {
            redraw = false;
            al_clear_to_color(al_map_rgb(0, 0, 0));

            if (frame_count < (1000/TARGET_FPS)) {
                frame_count += elapsed;
            }
            else {
                int X, Y;

                frame_count -= (1000/TARGET_FPS);

                for (star = 0; star < NUM_STARS/3; star++) {
                    Point *p = &stars[0][star];
                    al_draw_pixel(p->x, p->y, colors[0]);
                }
                /*	al_lock_bitmap(al_get_backbuffer(display), ALLEGRO_PIXEL_FORMAT_ANY, 0); */

                for (layer = 1; layer < 3; layer++) {
                    for (star = 0; star < NUM_STARS/3; star++) {
                        Point *p = &stars[layer][star];
                        // put_pixel ignores blending
                        al_put_pixel(p->x, p->y, colors[layer]);
                    }
                }

                /* Check that dots appear at the window extremes. */
                X = SCREEN_W - 1;
                Y = SCREEN_H - 1;
                al_put_pixel(0, 0, al_map_rgb_f(1, 1, 1));
                al_put_pixel(X, 0, al_map_rgb_f(1, 1, 1));
                al_put_pixel(0, Y, al_map_rgb_f(1, 1, 1));
                al_put_pixel(X, Y, al_map_rgb_f(1, 1, 1));

                /* al_unlock_bitmap(al_get_backbuffer(display)); */
                total_frames++;
            }

            now = al_get_time() * 1000;
            elapsed = now - start;
            start = now;

            for (layer = 0; layer < 3; layer++) {
                for (star = 0; star < NUM_STARS/3; star++) {
                    Point *p = &stars[layer][star];
                    p->y -= speeds[layer] * elapsed;
                    if (p->y < 0) {
                        p->x = rand() % SCREEN_W;
                        p->y = SCREEN_H;
                    }
                }
            }
            draw_ship(ship);

            if(!blast->gone) {
                draw_blast(blast);
            }
            draw_asteroids(a);
            al_flip_display();
        }
    }

    length = al_get_time() - program_start;

    /* printf("Length = %f\n", length); */

    al_destroy_timer(timer);
    al_destroy_display(display);
    al_destroy_event_queue(event_queue);

    return 0;
}
Esempio n. 10
0
int main(void)
{
    bool done =false;
    bool redraw = true;
    ALLEGRO_DISPLAY *display = NULL;
    ALLEGRO_TIMER *timer =NULL;
    ALLEGRO_EVENT_QUEUE *event_queue = NULL;
    SpaceShip ship;
    Bullet bullet[num_bullets];
    Commet commet[num_commets];
    if(!al_init())
    {
        fprintf(stderr,"allegro is not intialized");
        return -1;
    }
    display = al_create_display(SCREEN_W,SCREEN_H);
    if(!display)
    {
        fprintf(stderr,"failed to intialize the display");
        return -1;
    }
    
    timer  = al_create_timer(1.0/FPS);
    if(!timer)
    {
        fprintf(stderr,"failed to intialize timer");
        al_destroy_display(display);
        return -1;
    }
    event_queue = al_create_event_queue();
    if(!event_queue)
    {
        fprintf(stderr,"failed to create event queue");
        al_destroy_display(display);
        al_destroy_timer(timer);
        return -1;
    }
    al_install_keyboard();
    al_register_event_source(event_queue,al_get_timer_event_source(timer));
    al_register_event_source(event_queue,al_get_keyboard_event_source());
    al_register_event_source(event_queue,al_get_display_event_source(display));
    init_ship(&ship);
    init_bullet(&bullet);
    init_commet(&commet);
    al_start_timer(timer);
    while(!done)
    {
        
        ALLEGRO_EVENT ev;
        al_wait_for_event(event_queue,&ev);
        
        if(ev.type == ALLEGRO_EVENT_TIMER)
        {
            if(keys[KEY_UP])
            {
                move_ship_up(&ship);
            }
            if(keys[KEY_DOWN])
            {
                move_ship_down(&ship);
            }if(keys[KEY_LEFT])
            {
                move_ship_left(&ship);
            }
            if(keys[KEY_RIGHT])
            {
                move_ship_right(&ship);
            }
            if(keys[KEY_SPACEBAR])
            {
                fire_bullet(&bullet,&ship);
            }
            if(!GameOver)
            {
                update_bullet(&bullet);
                update_commet(&commet);
                bullet_collision(&bullet,&commet);
            }
            
            redraw = true;
        }
        else if(ev.type==ALLEGRO_EVENT_DISPLAY_CLOSE)
        {
            done = true;
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
        {
            switch(ev.keyboard.keycode)
            {
                case ALLEGRO_KEY_UP:
                {
                    keys[KEY_UP]=true;
                    break;
                }
                case ALLEGRO_KEY_DOWN:
                {
                    keys[KEY_DOWN]=true;
                    break;
                }
                case ALLEGRO_KEY_LEFT:
                {
                    keys[KEY_LEFT]=true;
                    break;
                }
                case ALLEGRO_KEY_RIGHT :
                {
                    keys[KEY_RIGHT]=true;
                    break;
                }
                case ALLEGRO_KEY_SPACE:
                {
                    keys[KEY_SPACEBAR] = true;
                    break;
                }
                    
            }
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_UP)
        {
            switch(ev.keyboard.keycode)
            {
                case ALLEGRO_KEY_UP:
                {
                    keys[KEY_UP]=false;
                    break;
                }
                case ALLEGRO_KEY_DOWN:
                {
                    keys[KEY_DOWN]=false;
                    break;
                }
                case ALLEGRO_KEY_LEFT:
                {
                    keys[KEY_LEFT]=false;
                    break;
                }
                case ALLEGRO_KEY_RIGHT :
                {
                    keys[KEY_RIGHT]=false;
                    break;
                }
                case ALLEGRO_KEY_SPACE:
                {
                    keys[KEY_SPACEBAR]=false;
                    break;
                }
                    
            }
        }
        
        if(redraw && al_event_queue_is_empty(event_queue))
        {
            redraw = false ;
            al_clear_to_color(al_map_rgb(255,100,100));
            draw_ship(&ship);
            draw_bullet(bullet);
            draw_commet(commet);
            al_flip_display();
            al_clear_to_color(al_map_rgb(255,100,100));
            
            
        }
    }
    al_destroy_display(display);
    al_destroy_timer(timer);
    al_destroy_event_queue(event_queue);
    return 0;
}
Esempio n. 11
0
File: game.c Progetto: ooonak/cmess
int main(int argc, char **argv)
{
  ALLEGRO_DISPLAY *display = NULL;
  ALLEGRO_EVENT_QUEUE *event_queue = NULL;
  ALLEGRO_TIMER *timer = NULL;
  ALLEGRO_FONT *font_arial_36 = NULL;
  ALLEGRO_FONT *font_arial_24 = NULL;
  ALLEGRO_TRANSFORM transform;
  bool key[6] = { false, false, false, false, false, true };
  bool redraw = true;
  bool doexit = false;
  char display_score[20];
  char display_lives[20];
  char display_ammo[20];
  char display_countdown[20];
  int ammo = 99;

  if(!al_init()) {
    fprintf(stderr, "failed to initialize allegro!\n");
    return -1;
  }

  al_init_font_addon();
  if (!al_init_ttf_addon()) {
    fprintf(stderr, "failed to initialize ttf addon!\n");
    return -1;
  }

  if(!al_install_keyboard()) {
    fprintf(stderr, "failed to initialize the keyboard!\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;
  }

  event_queue = al_create_event_queue();
    if(!event_queue) {
      fprintf(stderr, "failed to create event_queue!\n");
      al_destroy_display(display);
      al_destroy_timer(timer);
      return -1;
    }

  font_arial_36 = al_load_ttf_font("arial.ttf", 36, 0);
  if (!font_arial_36){
    fprintf(stderr, "arial 36 not loaded!\n" );
    return -1;
  }

  font_arial_24 = al_load_ttf_font("arial.ttf", 24, 0);
  if (!font_arial_36){
    fprintf(stderr, "arial 24 not loaded!\n" );
    return -1;
  }

  al_init_primitives_addon();

  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_register_event_source(event_queue, al_get_keyboard_event_source());

  /* Start game */
  Spaceship* ship = new_ship();
  last = make_roids(ROIDS);
  Blast **blasts = new_blasts();
  
  int countdown = 10;
  while(countdown && !DEBUG_MODE) {
    al_clear_to_color(al_map_rgb(0,0,0));
    /* Welcome - Ugly code, write nicer function. */
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_36, 
                 al_map_rgb(255,0,0), 
                 SCREEN_W/2, 
                 100,
                 ALLEGRO_ALIGN_CENTRE, 
                 "Welcome to Casper's BLASTEROIDS!");
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_24, 
                 al_map_rgb(230,230,230), 
                 SCREEN_W/2, 
                 150,
                 ALLEGRO_ALIGN_CENTRE, 
                 "You got three lives, 100 shots and a lot of asteroids to blast.");
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_24, 
                 al_map_rgb(230,230,230), 
                 SCREEN_W/2, 
                 170,
                 ALLEGRO_ALIGN_CENTRE, 
                 "Fire with space, steer with the arrow keys and hit escape");
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_24, 
                 al_map_rgb(230,230,230), 
                 SCREEN_W/2, 
                 190,
                 ALLEGRO_ALIGN_CENTRE, 
                 "if you don't dare to play to the end...");
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_24, 
                 al_map_rgb(230,230,230), 
                 SCREEN_W/2, 
                 230,
                 ALLEGRO_ALIGN_CENTRE, 
                 "(If you get hit by and asteroid, you will die,"); 
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_24, 
                 al_map_rgb(230,230,230), 
                 SCREEN_W/2, 
                 250,
                 ALLEGRO_ALIGN_CENTRE, 
                 "the first five seconds of a new life, they won't hurt you.)");
    sprintf(display_countdown, "%d", countdown);
    al_identity_transform(&transform);
    al_use_transform(&transform);
    al_draw_text(font_arial_24, 
                 al_map_rgb(230,230,230), 
                 SCREEN_W/2, 
                 300,
                 ALLEGRO_ALIGN_CENTRE, 
                 display_countdown);

    al_flip_display();
    sleep(1);
    countdown--;
  }

  al_start_timer(timer);

  while(!doexit) {
    ALLEGRO_EVENT ev;
    al_wait_for_event(event_queue, &ev);
    if(ev.type == ALLEGRO_EVENT_TIMER) {
      redraw = true;
      if(ship->timer > 0)
      ship->timer--;
    }

    else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
      break;
    }

    else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) {
      switch(ev.keyboard.keycode) {
        case ALLEGRO_KEY_K:
        case ALLEGRO_KEY_UP:
          key[KEY_UP] = true;
          move_ship(ship, KEY_UP);
          break;
        case ALLEGRO_KEY_J:
        case ALLEGRO_KEY_DOWN:
          key[KEY_DOWN] = true;
          move_ship(ship, KEY_DOWN);
          break;
        case ALLEGRO_KEY_H:
        case ALLEGRO_KEY_LEFT:
          key[KEY_LEFT] = true;
          move_ship(ship, KEY_LEFT);
          break;
        case ALLEGRO_KEY_L:
        case ALLEGRO_KEY_RIGHT:
          key[KEY_RIGHT] = true;
          move_ship(ship, KEY_RIGHT);
          break;
        case ALLEGRO_KEY_SPACE:
          key[KEY_SPACE] = true;
          if (ammo>0) {
            shoot_blast(blasts[ammo], ship);
            ammo--;
          }
          break;
        case ALLEGRO_KEY_ESCAPE:
          doexit = true;
          break;
      }
    }

    if(redraw && al_is_event_queue_empty(event_queue)) {
      redraw = false;
      al_clear_to_color(al_map_rgb(0,0,0));

      move_ship(ship, NONE);
      draw_ship(ship);

      move_blasts(blasts);
      draw_blasts(blasts);

      check_collision(last, ship, blasts);

      move_roids(last);
      draw_roids(last);

      if(!ship->lives || !ammo) {
        /* Game over. */
        al_identity_transform(&transform);
        al_use_transform(&transform);
        al_draw_text(font_arial_36, 
                     al_map_rgb(200,200,200), 
                     SCREEN_W/2, 
                     SCREEN_H/2-100, 
                     ALLEGRO_ALIGN_CENTRE, 
                     "GAME OVER");
        doexit = "true";
      }

      if(!ROIDS_ALIVE) {
        /* You Won. */
        al_identity_transform(&transform);
        al_use_transform(&transform);
        al_draw_text(font_arial_36, 
                     al_map_rgb(200,200,200), 
                     SCREEN_W/2, 
                     SCREEN_H/2-100, 
                     ALLEGRO_ALIGN_CENTRE, 
                     "YOU WON");
        doexit = "true";
      }

      /* Score */
      al_identity_transform(&transform);
      al_use_transform(&transform);

      sprintf(display_score, "%d", score);
      al_draw_text(font_arial_24, 
                   al_map_rgb(200,200,200), 
                   50, 
                   10, 
                   ALLEGRO_ALIGN_CENTRE, 
                   display_score);
      /* Lives */
      sprintf(display_lives, "%d", ship->lives);
      al_draw_text(font_arial_24, 
                   al_map_rgb(200,200,200), 
                   SCREEN_W-50, 
                   10, 
                   ALLEGRO_ALIGN_CENTRE, 
                   display_lives);
      /* Ammo */
      al_identity_transform(&transform);
      al_use_transform(&transform);

      sprintf(display_ammo, "%d", ammo);
      al_draw_text(font_arial_24, 
                   al_map_rgb(200,200,200), 
                   50, 
                   SCREEN_H-50,
                   ALLEGRO_ALIGN_CENTRE, 
                   display_ammo);

      al_flip_display();
      if (doexit)
        sleep(3);
    }
  }

  destroy_ship(ship);
  destroy_roids(last);
  destroy_blasts(blasts);

  /* End game. */

  al_shutdown_primitives_addon();
  al_destroy_timer(timer);
  al_destroy_display(display);
  al_destroy_event_queue(event_queue);

  return 0;
}