C: Hur man använder Allegro i teknikinstitutionens datorsalar

Om du gör uppgiften i teknikinstitutionens datorsalar på universitetet, så är Allegro redan installerat. Vi kan därför gå direkt till att skapa ett projekt som använder Allegro.

1. Installationen

Vi börjar med att undersöka var Allegro-bibliotekets filer finns på datorn. De ligger i katalogen C:\Program Files\allegro-5.0.4-msvc-10.0:

Den uppackade zip-filen allegro-5.0.4-msvc-10.0.zip

(Detta gäller när jag skriver detta, 28 september 2011. I framtiden kan det komma nya versioner, med andra versionsnummer, och då kommer katalognamnet anatagligen också att ändras.)

"msvc-10.0" betyder Microsoft Visual C++ 10.0, vilket är den C- och C++-kompilator som ingår i Visual Studio 2010.

I den här mappen finns tre undermappar, bin, include och lib.

Om vi börjar med mappen include så finns där de header-filer som vi ska inkludera i våra Allegro-program.

include-mappen

Som synes ligger de flesta av dem i en undermapp, allegro5, och därför kommer vi att skriva till exempel #include <allegro5/allegro.h> och inte bara #include <allegro.h>.

I mappen lib finns de biblioteksfiler som Allegro-programmen behöver. Filändelsen "lib" betyder "library", alltså "bibliotek". Det är här är så att säga själva biblioteket med Allegro-funktioner som vi kan anropa från våra Allegro-program, uppdelat på flera olika filer och i olika versioner. Till exempel finns det särskilda versioner för debugging.

lib-mappen

I mappen bin finns DLL-filer. "DLL" betyder "dynamic-link library", och är en annan variant av biblioteksfiler.

bin--mappen

3. Gör ett program

Starta Visual Studio 2010, och skapa ett nytt projekt. (Klicka på File, välj sen New, och Project.) Vi ska skapa ett tomt projekt, utan någon för-genererad kod, så vi väljer Visual C++ som språk, och Empty Project:

Ett tomt projekt i Visual C++

Det har visat sig att det här inte fungerar för alla. Man kan behöva skapa projektet som en tom Win32 Console Application, på samma sätt som när man skapar ett enkelt C-program i Visual Studio 2010.

Skapa en källkodsfil, till exempel med namnet Allegrospel.c, och skriv in eller kopiera följande programkod:

// A very simple Allegro program

#include <stdlib.h>
#include <stdio.h>
#define USE_CONSOLE
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>

int main(int argc, char *argv[]) {
    ALLEGRO_DISPLAY *display = NULL;

    // Initializing allegro
    if (!al_init()) {
        fprintf(stderr, "Couldn't initialize allegro. Sorry.\n");
        return EXIT_FAILURE;
    }

    if (!al_init_primitives_addon()) {
        fprintf(stderr, "Couldn't initialize allegro addons. Sorry.\n");
        return EXIT_FAILURE;
    }

    // Creating a window
    display = al_create_display(400, 300);
    if (display == NULL) {
        fprintf(stderr, "Couldn't create the window.\n");
        return EXIT_FAILURE;
    }

    // Painting it green
    al_clear_to_color(al_map_rgb(0, 255, 0)); 
    al_draw_filled_rectangle(200, 100, 250, 150, al_map_rgb(255, 0, 0));
    al_flip_display();

    printf("Now you should see a green window with a red square.\n");
    printf("Press ENTER to exit.\n");
    getchar();

    // Exiting the program
    al_destroy_display(display);

    return EXIT_SUCCESS;
}

Ögna igenom programkoden och gissa vad den gör!

4. Tala om för Visual Studio var Allegro-filerna finns

Om vi nu försöker kompilera och provköra programmet, kommer vi att få en massa felmeddelanden. Det första problemet är att include-filen allegro5/allegro.h inte hittas. Och det är ju egentligen inte så konstigt, för vi har inte talat om för Visual Studio var Allegros include-filer finns.

Kom ihåg var vi packade upp Allegro-paketet:

Den uppackade zip-filen allegro-5.0.4-msvc-10.0.zip

Include-filerna finns förstås i mappen include. Det är alltså filer som ska inkluderas i Allegro-programmen med #include, på samma sätt som till exempel stdio.h. De innehåller deklarationer av de programrutiner som Allegro-programmen kommer att anropa. (En deklaration i C talar om att en funktion finns, vad den heter och vilka parametrar man kan skicka till den, men funktionskroppen, med vad funktionen faktiskt gör, finns inte med.)

Vi skulle kunna kopiera Allegros include-filer till Visual C++:s mapp med system-include-filer, men ett bättre sätt är att låta Allegros include-filer ligga kvar där de är, och tala om för Visual Studio var de finns. Därför klickar vi på Project i menylisten, och väljer projektnamn Properties..., så får vi fram projektets egenskapsfönster (eller "property-fönster", om man vill prata svengelska). Använd menyträdet till vänster för att komma fram till allmänna inställningar för C/C++, och markera Additional Include Directories ("ytterligare include-kataloger"):

Egenskaper för projektet

Lägg till namnet på Allegros include-katalog, i det här fallet C:\Program Files\allegro-5.0.4-msvc-10.0\include:

Vi lägger till include-katalogen

Klicka på OK för att lägga in ändringen och komma tillbaka till egenskapsfönstret.

Detta förutsätter att vi använder Allegro version 5.0.4. I framtiden kan det komma nya versioner, med andra versionsnummer, och då måste man, här och nedanför, anpassa namnen på filer och kataloger så de stämmer med vad som verkligen är installerat på datorn.

Vi måste också tala om för Visual Studio vilka biblioteksfiler vårt Allegro-program ska använda sig av. Därför fortsätter vi i egenskapsfönstret, och använder menyträdet till vänster för att komma fram till indata till länkaren. Markera Additional Dependencies ("ytterligare beroenden"):

Egenskaper för projektet

Lägg till ett ytterligare beroende, allegro-5.0.4-monolith-mt-debug.lib. Det är nämligen den bibliotekesfilen vi ska länka med. Så här:

Vi lägger till biblioteksfilen

Klicka på OK för att lägga in ändringen och komma tillbaka till egenskapsfönstret.

Dessutom måste vi tala om var den och de andra biblioteksfilerna finns. Därför fortsätter vi i egenskapsfönstret, och använder menyträdet till vänster för att komma fram till de allmänna inställningarna för länkaren. Markera Additional Library Directories ("ytterligare bibliotekskataloger"):

Egenskaper för projektet

Lägg till namnet på Allegros bibliotekskatalog, i det här fallet C:\Program Files\allegro-5.0.4-msvc-10.0\lib:

Vi lägger till bibliotekskatalogen

Klicka på OK för att lägga in ändringen och komma tillbaka till egenskapsfönstret.

En sista inställning som vi måste göra är att tala om var DLL-filerna finns. Välj Debugging i menyn till vänster, och Environment:

Egenskaper för projektet

Katalogen med DLL-filerna, C:\Program Files\allegro-5.0.4-msvc-10.0\bin, ska finnas med i sökvägen till körbara program, som finns i omgivningsvariabeln PATH Det här är texten vi ska skriva in: PATH=C:\Program Files\allegro-5.0.4-msvc-10.0\bin;%PATH%

Vi lägger till bin-katalogen i sökvägen

Klicka på OK för att lägga in ändringen och komma tillbaka till egenskapsfönstret.

Klicka till slut på OK i egenskapsfönstret.

5. Provkör programmet

Kompilera ("bygg") och provkör programmet. Om allt är rätt ska det dyka upp ett grönt fönster med en röd ruta:

Gröna rutan

Detta är det 400 gånger 300 bildpunkter stora fönster som vi skapade med anropet al_create_display(400, 300) i vårt program. Den gröna färgen skapade vi med al_map_rgb(0, 255, 0), för G:et i RGB står ju just för "grönt".

Dessutom dyker det upp ett konsolfönster, eftersom programmet skriver och läser med hjälp av printf och getchar:

Konsolfönstret

En lite lustig effekt är vad som händer om man minimerar det gröna spelfönstret, och sen öppnar det igen. Då ritas innehållet inte ut, utan man ser fortfarande bakgrunden:

Gröna rutan utan grönt

(Beroende på vilket system man kör på, kan spelfönstret bli svart i stället.)

I grafiska fönstersystem, som Microsoft Windows eller Unix-världens X, brukar själva systemet inte lagra och komma ihåg innehållet i de fönster som visas på skärmen. I stället måste programmet som kör i fönstret rita upp innehållet på nytt varje gång fönstret visas, till exempel om det varit minimerat eller dolt av ett annat fönster. Men det här testprogrammet är upptaget med att stå och vänta på inmatning (med getchar), så det kan inte rita något!

Vi har konfigurerat projektet för att använda debug-versionen av Allegro-biblioteket. Det passar bra när vi utvecklar och provkör våra egna Allegro-program, men om vi ska skriva spel och distribuera dem till andra, bör vi använda en annan konfiguration. Den som vill lära sig mer om detta kan läsa mer i Allegro-dokumentationen (www.allegro.cc/manual) och i Allegro-wikin (wiki.allegro.cc).


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 18 december 2012