Outils pour utilisateurs

Outils du site


allegro:bitmaps

**Ceci est une ancienne révision du document !** ----

A PCRE internal error occured. This might be caused by a faulty plugin

===== Bitmaps ===== Dans cet article nous allons voir comment créer des bitmaps et comment dessiner dessus. ==== Buffer d'affichage/de dessin ==== Allegro 5 introduit le concept de buffer d'affichage, et de buffer de dessin. Ils sont tous deux liés, à part que le buffer de dessin ne doit pas être affiché. Quand on crée un display, on crée des sous-buffers dont des buffers de dessin. Toutes les opérations de dessin doivent se faire sur le buffer de dessin, qui dans la plupart des cas est l'un des sous-buffers du display actuel. ==== Basic Example ==== Building on the previous example, we will add a bouncing bitmap. <file c main.c> #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; } </file> === Walk through === Building on the last example we have added a silly bouncing bitmap. We will only cover the new and changed bits. <code c>const int SCREEN_W = 640; const int SCREEN_H = 480; const int BOUNCER_SIZE = 32;</code> Here we've defined a few constants to make our lives a little easier. Two to define the size of the display, and one for the dimensions of the bouncing box. <code c> 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; }</code> Here we create our bitmap using **al_create_bitmap** with a width and height of **BOUNCER_SIZE**. On failure, **al_create_bitmap** will return **NULL**, and our failure handling code will clean up previously created objects, and then exit the program. <code c> al_set_target_bitmap(bouncer);</code> Here's a new concept. The target bitmap is the bitmap in which all drawing functions currently draw to. This is normally handled by allegro, but should you need to draw directly to a bitmap (rather than loading one), you call **al_set_target_bitmap** and then use the drawing functions as normal. <code c> al_clear_to_color(al_map_rgb(255, 0, 255));</code> Like before, except now **al_clear_to_color** clears our bitmap, instead of the display. <code> al_set_target_bitmap(al_get_backbuffer(display));</code> Change the drawing target back to the display we created. <code c> 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;</code> Not particularly interesting. But here is the bouncing logic. If the square hits the display's borders, reverse direction. We put the logic in the timer event, so that the bouncing bitmap moves at the same rate on any computer. <code c> al_draw_bitmap(bouncer, bouncer_x, bouncer_y, 0);</code> Now draw our bitmap to the display. <code c> al_destroy_bitmap(bouncer);</code> Destroy the bouncer bitmap. That concludes the basic Bitmap use in Allegro 5. ==== Intermediate Example ==== FIXME Loading bitmaps using the allegro-image addon Example will go here. [[allegro:timers|Précédent]] << [[allegro:start|Sommaire]] >> [[allegro:input|Suivant]]

allegro/bitmaps.1323080296.txt.gz · Dernière modification: 2011/12/05 11:18 par mrhide