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 `allegroconfig 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
#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()
Initieringen och main
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
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);
}
Spelloop med multipla banor
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 ...
Händelsehantering
void draw_graphics(Game *game) { /* Rita hela världen:
bakgrund
äpplen&mask
eller alla bitar */
}
Rita ”världen”
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)