// Funcao principal. int main(void) { int bitmapSize; srand(time(0)); // Funcao de inicializacao da Allegro al_init(); // Chamada de funcao para forcar o uso de OpenGL ao inves de DirectX (DirectX eh o default) al_set_new_display_flags(ALLEGRO_OPENGL); // Funcao para criar uma janela com as dimensoes passadas como parametro, que torna-se // automaticamente ativa, com o backbuffer selecionado para desenho. Os parametros // da janela sao determinados pelas ultimas chamadas a "al_set_new_display_*". ALLEGRO_DISPLAY *display = al_create_display(600, 600); height = 600; // Inicializa the "Image IO addon", que tem funcoes declaradas no seguinte // header: #include <allegro5/allegro_image.h> al_init_image_addon(); // Prototipo: ALLEGRO_BITMAP *al_load_bitmap(const char *filename) // Carrega uma imagem para a struct ALLEGRO_BITMAP. O tipo do // arquivo é determinado pela extensao (bmp ou png). parent = al_load_bitmap("char9.png"); if (!parent) { std::cout << "Error loading data/char9.png\n"; return 1; } add_sprites(parent); // Funcao usada para especificar o titulo da janela. //al_set_window_title("Teste da Allegro com Sprite Animada"); // Funcao que instala um driver de teclado. Se der problema, retorna false, senao retorna true. if ( !al_install_keyboard() ) { return 1; // encerra se deu problema } // Funcao que instala um driver de mouse. Se der problema, retorna false, senao retorna true. if ( !al_install_mouse() ){ return 1; // encerra se deu problema } // ALLEGRO_TIMER* al_install_timer(double speed_secs) // Funcao que instala um novo timer, retornando o ponteiro para o mesmo. Se der // problema, retorna NULL. O valor passado como parametro deve ser positivo. // O novo timer (ou controlador de tempo) é inicializado parado. ALLEGRO_TIMER *timer = al_create_timer(1.0 / FPS); // Funcao que cria uma fila de eventos nova e vazia, retornando o ponteiro para o objeto criado, // ou NULL se ocorreu um erro. event_queue = al_create_event_queue(); if (event_queue==NULL) { return 1; // encerra se deu problema } // al_register_event_source(): registra a fonte de eventos com a fila de eventos especificada. // al_get_mouse_event_source(): recupera a fonte de eventos do mouse. // al_get_keyboard_event_source(): recupera a fonte de eventos do teclado. // al_get_display_event_source(): recupera a fonte de evento associada a janela. // al_get_timer_event_source(ALLEGRO_TIMER *timer): recupera a fonte de eventos associada. al_register_event_source(event_queue, al_get_mouse_event_source()); al_register_event_source(event_queue, al_get_keyboard_event_source()); al_register_event_source(event_queue, al_get_timer_event_source(timer)); al_register_event_source(event_queue, al_get_display_event_source(display)); // void al_start_timer(ALLEGRO_TIMER *timer) inicia o timer passado por parametro. // A partir disso, o contador do timer vai incrementar em um frequencia constante // e vai comecar a gerar eventos. Inicializar um timer que ja foi inicializado nao // faz nada. al_start_timer(timer); // Funcao que estabelece o loop do programa, que fica a espera de eventos main_loop(); al_destroy_bitmap(parent); return 0; }
int main(void) { ALLEGRO_TIMER *timer; ALLEGRO_EVENT_QUEUE *queue; ALLEGRO_MONITOR_INFO info; int w = 640, h = 480; bool done = false; bool need_redraw = true; bool background = false; example.show_help = true; if (!al_init()) { abort_example("Failed to init Allegro.\n"); return 1; } if (!al_init_image_addon()) { abort_example("Failed to init IIO addon.\n"); return 1; } al_init_font_addon(); al_get_num_video_adapters(); al_get_monitor_info(0, &info); #ifdef ALLEGRO_IPHONE al_set_new_display_flags(ALLEGRO_FULLSCREEN_WINDOW); #endif al_set_new_display_option(ALLEGRO_SUPPORTED_ORIENTATIONS, ALLEGRO_DISPLAY_ORIENTATION_ALL, ALLEGRO_SUGGEST); example.display = al_create_display(w, h); w = al_get_display_width(example.display); h = al_get_display_height(example.display); if (!example.display) { abort_example("Error creating display.\n"); return 1; } if (!al_install_keyboard()) { abort_example("Error installing keyboard.\n"); return 1; } if (!al_install_mouse()) { abort_example("Error installing mouse.\n"); return 1; } example.font = al_load_font("data/fixed_font.tga", 0, 0); if (!example.font) { abort_example("Error loading data/fixed_font.tga\n"); return 1; } example.mysha = al_load_bitmap("data/mysha256x256.png"); if (!example.mysha) { abort_example("Error loading data/mysha256x256.png\n"); return 1; } example.white = al_map_rgb_f(1, 1, 1); example.half_white = al_map_rgba_f(1, 1, 1, 0.5); example.dark = al_map_rgb(15, 15, 15); example.red = al_map_rgb_f(1, 0.2, 0.1); change_size(256); add_sprite(); add_sprite(); timer = al_create_timer(1.0 / FPS); queue = al_create_event_queue(); al_register_event_source(queue, al_get_keyboard_event_source()); al_register_event_source(queue, al_get_mouse_event_source()); al_register_event_source(queue, al_get_timer_event_source(timer)); if (al_install_touch_input()) al_register_event_source(queue, al_get_touch_input_event_source()); al_register_event_source(queue, al_get_display_event_source(example.display)); al_start_timer(timer); while (!done) { float x, y; ALLEGRO_EVENT event; w = al_get_display_width(example.display); h = al_get_display_height(example.display); if (!background && need_redraw && al_is_event_queue_empty(queue)) { double t = -al_get_time(); add_time(); al_clear_to_color(al_map_rgb_f(0, 0, 0)); redraw(); t += al_get_time(); example.direct_speed_measure = t; al_flip_display(); need_redraw = false; } al_wait_for_event(queue, &event); switch (event.type) { case ALLEGRO_EVENT_KEY_CHAR: /* includes repeats */ if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) done = true; else if (event.keyboard.keycode == ALLEGRO_KEY_UP) { add_sprites(1); } else if (event.keyboard.keycode == ALLEGRO_KEY_DOWN) { remove_sprites(1); } else if (event.keyboard.keycode == ALLEGRO_KEY_LEFT) { change_size(example.bitmap_size - 1); } else if (event.keyboard.keycode == ALLEGRO_KEY_RIGHT) { change_size(example.bitmap_size + 1); } else if (event.keyboard.keycode == ALLEGRO_KEY_F1) { example.show_help ^= 1; } else if (event.keyboard.keycode == ALLEGRO_KEY_SPACE) { example.use_memory_bitmaps ^= 1; change_size(example.bitmap_size); } else if (event.keyboard.keycode == ALLEGRO_KEY_B) { example.blending++; if (example.blending == 4) example.blending = 0; } break; case ALLEGRO_EVENT_DISPLAY_CLOSE: done = true; break; case ALLEGRO_EVENT_DISPLAY_HALT_DRAWING: background = true; al_acknowledge_drawing_halt(event.display.source); break; case ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING: background = false; break; case ALLEGRO_EVENT_DISPLAY_RESIZE: al_acknowledge_resize(event.display.source); break; case ALLEGRO_EVENT_TIMER: update(); need_redraw = true; break; case ALLEGRO_EVENT_TOUCH_BEGIN: x = event.touch.x; y = event.touch.y; goto click; case ALLEGRO_EVENT_MOUSE_BUTTON_UP: x = event.mouse.x; y = event.mouse.y; goto click; click: { int fh = al_get_font_line_height(example.font); if (x < 80 && y >= h - fh * 10) { int button = (y - (h - fh * 10)) / (fh * 2); if (button == 0) { example.use_memory_bitmaps ^= 1; change_size(example.bitmap_size); } if (button == 1) { example.blending++; if (example.blending == 4) example.blending = 0; } if (button == 3) { if (x < 40) remove_sprites(example.sprite_count / 2); else add_sprites(example.sprite_count); } if (button == 2) { int s = example.bitmap_size * 2; if (x < 40) s = example.bitmap_size / 2; change_size(s); } if (button == 4) { example.show_help ^= 1; } } break; } } } al_destroy_bitmap(example.bitmap); return 0; }