/* This is a temporary example to get a feeling for the new API, which was very * much in flux yet when this example was created. * * Right now, it moves a red rectangle across the screen with a speed of * 100 pixels / second, limits the FPS to 100 Hz to save CPU, and prints the * current FPS in the top right corner. */ #include "allegro.h" #include "allegro/platform/ald3d.h" #include #include "d3d.h" int main(void) { AL_DISPLAY *display[3]; AL_KEYBOARD *keyboard; AL_EVENT event; AL_EVENT_QUEUE *events; BITMAP *buffer; int quit = 0; int ticks = 0, last_rendered = 0, start_ticks; int fps_accumulator = 0, fps_time = 0; double fps = 0; int FPS = 100; int x = 0, y = 0; int dx = 1; int w = 640, h = 480; AL_BITMAP *picture; allegro_init(); al_init(); events = al_create_event_queue(); /* Create three windows. */ display[0] = al_create_display(w, h, AL_WINDOWED | AL_OPENGL | AL_RESIZABLE); display[1] = al_create_display(w, h, AL_WINDOWED | AL_OPENGL | AL_RESIZABLE); display[2] = al_create_display(w, h, AL_WINDOWED | AL_OPENGL); printf("display[0]=%p %p\n", display[0], ((AL_DISPLAY_D3D *)display[0])->window); printf("display[1]=%p %p\n", display[1], ((AL_DISPLAY_D3D *)display[1])->window); printf("display[2]=%p %p\n", display[2], ((AL_DISPLAY_D3D *)display[2])->window); printf("d3d_ok=%d\n", D3D_OK); /* This is only needed since we want to receive resize events. */ al_register_event_source(events, (AL_EVENT_SOURCE *)display[0]); al_register_event_source(events, (AL_EVENT_SOURCE *)display[1]); al_register_event_source(events, (AL_EVENT_SOURCE *)display[2]); /* Apparently, need to think a bit more about memory/display bitmaps.. should * only need to load it once (as memory bitmap), then make available on all * displays. */ al_make_display_current(display[2]); picture = al_load_bitmap("mysha.pcx", 0); al_install_keyboard(); printf("registering kb as event source\n"); al_register_event_source(events, (AL_EVENT_SOURCE *)al_get_keyboard()); printf("kb registered as event source\n"); start_ticks = al_current_time(); while (!quit) { /* read input */ while (!al_event_queue_is_empty(events)) { printf("event queue not empty %d\n", event.type); al_get_next_event(events, &event); printf("got next event\n"); if (event.type == AL_EVENT_KEY_DOWN) { AL_KEYBOARD_EVENT *key = &event.keyboard; if (key->keycode == AL_KEY_ESCAPE) { printf("esc\n"); quit = 1; } } if (event.type == AL_EVENT_DISPLAY_RESIZE) { printf("exnewapi receive resize event\n"); AL_DISPLAY_EVENT *display = &event.display; w = display->width; h = display->height; printf("w=%d h=%d\n", w, h); al_make_display_current(display->source); al_acknowledge_resize(); printf("exnewapi resized\n"); } if (event.type == AL_EVENT_DISPLAY_CLOSE) { quit = 1; } } /* handle game ticks */ while (ticks * 1000 < (al_current_time() - start_ticks) * FPS) { x += dx; if (x == 0) dx = 1; if (x == w - 40) dx = -1; ticks++; } /* render */ if (ticks > last_rendered) { int i; AL_COLOR colors[3] = { al_color(1, 0, 0, 0.5), al_color(0, 1, 0, 0.5), al_color(0, 0, 1, 0.5)}; for (i = 0; i < 3; i++) { al_make_display_current(display[i]); al_clear(al_color(1, 1, 1, 1)); al_filled_rectangle(x, y, x + 40, y + 40, colors[i]); if (i == 2) al_draw_bitmap(picture, x, y + 40); al_flip(); } last_rendered = ticks; { int d = al_current_time() - fps_time; fps_accumulator++; if (d >= 1000) { fps_time += d; fps = 1000.0 * fps_accumulator / d; fps_accumulator = 0; } } } else { int r = start_ticks + 1000 * ticks / FPS - al_current_time(); al_rest(r < 0 ? 0 : r); } } return 0; } END_OF_MAIN();