• No results found

Varför behövs det? I Allegro finns t.ex. stöd för:

N/A
N/A
Protected

Academic year: 2022

Share "Varför behövs det? I Allegro finns t.ex. stöd för:"

Copied!
21
0
0

Loading.... (view fulltext now)

Full text

(1)

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

(2)

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)

(3)

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

(4)

Multiplattform

Linux

Windows, mingw32 (dvs det som CB använder)

Windows, msvc

DOS

Mac OSX

Solaris

BeOS

m.fl.

(5)

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.

(6)

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)

(7)

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`

(8)

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

(9)

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

(10)

#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

(11)

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

(12)

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

(13)

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

(14)

I get_input.h :

#define DROP      0

#define MOVE_LEFT         1

#define ROTATE_CLOCK_WISE 2 ...

Händelsehantering

(15)

void draw_graphics(Game *game) {    /* Rita hela världen:

      ­ bakgrund

      ­ äpplen&mask

      ­ eller alla bitar     */

}

Rita ”världen”

(16)

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!

(17)

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

(18)

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!

(19)

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

(20)

Addons

Bildfiler: jpg, png, gif

Grafik: OpenGL, mm

Fonter: ttf, mm

Nätverk

GUI

Trådar

(21)

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)

References

Related documents

The aim of the work is to point out the possibilities of adapting the teaching process according to individual needs of pupils in a mixed-ability class and to propose strategies

[r]

[r]

[r]

[r]

[r]

Grundat i erfarenheter från församlingars vardag och med inspiration från Latour och andra tänkare diskuterar Jonas Ideström om hur teologisering handlar om att både urskilja och

Några andra misstag som tas upp (men som inte diskuteras av flera olika stämledare) är att inte vara tillräckligt förberedd, samt att lägga för stor vikt på de ökända