PROGRAM HelloWorld; (* First Allegro program. *) USES allegro5, al5font, al5image, al5primitives; (* Helper to test intialization. *) PROCEDURE MustInit (aTest: BOOLEAN; aDescription: STRING); BEGIN IF NOT aTest THEN BEGIN WriteLn ('couldn''t initialize ', aDescription, '.'); WriteLn ('Press [Enter] to close.'); ReadLn; Halt (1) END END; (* Helper to assign vertex. *) FUNCTION CreateVertex (CONST x, y: REAL; CONST Color: ALLEGRO_COLOR) : ALLEGRO_VERTEX; INLINE; BEGIN CreateVertex.x := x; CreateVertex.y := y; CreateVertex.z := 0; CreateVertex.u := 0; CreateVertex.v := 0; CreateVertex.color := Color END; VAR Timer: ALLEGRO_TIMERptr; Queue: ALLEGRO_EVENT_QUEUEptr; Event: ALLEGRO_EVENT; Display: ALLEGRO_DISPLAYptr; Font: ALLEGRO_FONTptr; Redraw, EndProgram: BOOLEAN; Mysha: ALLEGRO_BITMAPptr; v: ARRAY [0..3] OF ALLEGRO_VERTEX; BEGIN { Initialization. } MustInit (al_init, 'Allegro'); MustInit (al_install_keyboard, 'keyboard'); Timer := al_create_timer (1.0 / 30.0); MustInit (Assigned (Timer), 'timer'); { Create display. } al_set_new_display_option (ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); al_set_new_display_option (ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); al_set_new_bitmap_flags (ALLEGRO_MIN_LINEAR OR ALLEGRO_MAG_LINEAR); Display := al_create_display (640, 480); MustInit (Assigned (Display), 'display'); { Init/load graphics. } Font := al_create_builtin_font; MustInit (Assigned (Font), 'font'); MustInit (al_init_image_addon, 'image addon'); Mysha := al_load_bitmap ('mysha.png'); MustInit (Assigned (Mysha), 'mysha'); MustInit (al_init_primitives_addon, 'primitives'); { Create event queue. } Queue := al_create_event_queue; MustInit (Assigned (Queue), 'queue'); al_register_event_source (Queue, al_get_keyboard_event_source); al_register_event_source (Queue, al_get_display_event_source(Display)); al_register_event_source (Queue, al_get_timer_event_source (Timer)); { Create "complex" graphic. } v[0] := CreateVertex (210, 320, al_map_rgb_f(1, 0, 0)); v[1] := CreateVertex (330, 320, al_map_rgb_f(0, 1, 0)); v[2] := CreateVertex (210, 420, al_map_rgb_f(0, 0, 1)); v[3] := CreateVertex (330, 420, al_map_rgb_f(1, 1, 0)); { Initialize loop stuff. } Redraw := TRUE; EndProgram := FALSE; al_start_timer (Timer); { Main loop. } REPEAT al_wait_for_event (Queue, @Event); CASE Event.ftype OF ALLEGRO_EVENT_TIMER: { Game logic goes here. } Redraw := TRUE; ALLEGRO_EVENT_KEY_DOWN, ALLEGRO_EVENT_DISPLAY_CLOSE: { Close the program. } EndProgram := TRUE; END; { If must redraw and there's nothing pending... } IF Redraw AND al_is_event_queue_empty (Queue) THEN BEGIN al_clear_to_color (al_map_rgb (0, 0, 0)); al_draw_text (Font, al_map_rgb (255, 255, 255), 0, 0, 0, 'Hello world!'); al_draw_bitmap (Mysha, 100, 100, 0); al_draw_filled_triangle (35, 350, 85, 375, 35, 400, al_map_rgb_f (0, 1, 0)); al_draw_filled_rectangle (240, 260, 340, 340, al_map_rgba_f (0, 0, 0.5, 0.5)); al_draw_circle (450, 370, 30, al_map_rgb_f (1, 0, 1), 2); al_draw_line (440, 110, 460, 210, al_map_rgb_f (1, 0, 0), 1); al_draw_line (500, 220, 570, 200, al_map_rgb_f (1, 1, 0), 1); al_draw_prim (v, Nil, 0, 4, ALLEGRO_PRIM_TRIANGLE_STRIP); { Drawing was done in a backbuffer. } al_flip_display; { Updated. } Redraw := FALSE END UNTIL EndProgram; { Release resources. } al_destroy_bitmap (mysha); al_destroy_font (Font); al_destroy_display (Display); al_destroy_timer (Timer); al_destroy_event_queue (Queue) END.