Allegro Introduktion Översikt vad är Allegro? Vad är lib och h-fil Kolla kodexempel Strukturen på ett Allegrospel Hur kommer jag igång? Var kan jag läsa mer Addons Alternativ
Vad är Allegro? Ett spelprogrammeringsbibliotek ( lib ) Eller: multimedia-lib Det innehåller generella hjälpfunktioner som är nyttiga bl.a. då man gör spel Kan vara lika användbart i andra typer av program Allegro är fri programvara (öppen källkod)
Varför behövs det? I Allegro finns t.ex. stöd för: Grafik Ladda in bildfiler Direkt tangentbordsavkänning Timer Ljud Mus Joy-stick Skriva text i grafikläge Fonter Inget av detta stöds av standard-c
Multiplattform Linux Windows, mingw32 (dvs det som CB använder) Windows, msvc DOS Mac OSX Solaris BeOS m.fl.
Vad är ett lib Ihopbuntade objektfiler Var är objektfiler nu igen? - C-filer som är kompilerade men inte länkade till ett program! Vad är då skillnaden mellan lib och program? - Libbet är alltså inte länkat... Men är inte länka samma som att bunta ihop filerna? - Nej, i libbet kopplas inte funktionerna ihop med anropen. Normalt sett finns heller inget main() i ett lib.
Vad är ett lib? Man kan inte bygga ett program genom att bara länka ett lib Man måste t.ex. själv skriva ett main Man måste också t.ex. anropa en funktion i libbet för att den ska utföras. Detta är inte märkligare än att du anropar funktioner som printf, scanf, puts, etc. (de körs inte heller självmant)
Hur använda ett lib? En (eller flera) h-filer hör till ett lib Inkludera <allegro.h> för att använda Allegro (jfr stdio.h hör till libc ) Läs i dokumentationen vad funktionerna heter, semantiken (dvs vad det utför), parametrar och returvärden Länka ditt program med allegro: Linux: gcc *.o `allegro config libs release`
Hur länka med Allegro i Windows? Länka ditt program med allegro: Windows (Code::Blocks v.8.02): Välj menyn Settings Välj alternativet Compiler and debugger Välj fliken Linker settings I rutan Other linker options skriv: lalleg lkernel32 luser32 lgdi32 lcomdlg lole ldinput lddraw ldxguid lwinmm ldsound
Strukturen på Allegrospel Initiera Allegro Initiera grafik Initiera timer Initiera tangentbord Koden för spelet: Initiera spelet ladda in bilder bygg upp datastrukturer Meny (intro) Själva spelloopen
Initieringen och main #include <allegro.h> int main(void) { if (allegro_init() == 0) { install_keyboard(); if (set_gfx_mode(gfx_autodetect, 800, 600, 0, 0) == 0) { run_game(); } } return 0; } END_OF_MAIN()
Spelloop int run_game(void) { int status, updates=0; Game game; init_game(&game); do { while (my_ticks > updates) { command = get_input(); status = move(&game, command); if (status == DEAD) break; update_game(&game); updates++; } } draw_graphics(&game); } while (status!= DEAD); return status; }
Spelloop med multipla banor Kan se ut så här (run_level motsvarar den tidgare run_game): void run_game(void) { int level_nr=0, new_level; Level level; Game game; init_game_basics(&game); do { init_level(level_nr, &game, &level); new_level = run_level(&level); if (new_level) level_nr++; } while (new_level && level_nr<maxlevel); }
Händelsehantering int get_input(void) { int command; if (key[key_space]) { command = DROP; } else if (key[key_left]) { command = MOVE_LEFT; } else if (key[...]) { command = ROTATE_CLOCK_WISE; } else if (...)... } return command; }
Händelsehantering I get_input.h : #define DROP 0 #define MOVE_LEFT 1 #define ROTATE_CLOCK_WISE 2...
Rita världen void draw_graphics(game *game) { /* Rita hela världen: bakgrund äpplen&mask eller alla bitar */ }
Allegros BITMAP En BITMAP är en yta som man kan rita på och med Transparens genom färgen 0xff00ff draw_sprite() och blit() ritar en bitmap på en annan Endast draw_sprite() tar hänsyn till transparens Ritoperationer: line, rect, circle, polygon, etc Text output: textprintf_ex() Text input: tecken för tecken... readkey() + keypressed(); scanf() funkar inte!
Fonter Bitmappade fonter Färg Monokrom (samma färg över hela) Inbyggd font (mycket primitiv...) Hjälpprogram för ttf till bitmap Addons för ttf och antialiasing
Hur kommer jag igång? Ladda ner zip-en från Allegro - packa upp och läs allegro/docs/build/ compiler.txt Ladda ner och packa upp dx70_mgw.zip kopiera lib\* till MinGW\lib\ och include\* till MinGW\include (ligger troligen i CodeBlocks) Efter installation: Lägg till allegro-libbet (dvs -lalleg) och därefter -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lole32 -ldinput -lddraw -ldxguid -lwinmm -ldsound) som extra länkkommando i CB. Tuta och kör!
Kunskapskällor Allegros hemsida (se länksidan) Allegro.cc forum m.m. (länk från Allegro) Allegros docs (API), följer med Allegro Exemplen, följer med. Experimentera! Bok: Game Programming All in One
Addons Bildfiler: jpg, png, gif Grafik: OpenGL, mm Fonter: ttf, mm Nätverk GUI Trådar
Alternativ SDL Allegro lättare för nybörjare SDL använt i fler kommersiella program SDL är ej komplett Licenser SDL: LGPL Allegro: PD Använda systemets API (dåligt)