[F]Allegro Spielebibliothek



  • Allegro Spielebibliothek

    Inhalt

    1. Introduction
    2. Benötigtes
    3. Die Materie
    3.1 MessageBox
    3.2 Grafikmodus
    3.3 Pixel zeichnen
    3.4 Bilder anzeigen
    4. Nachwort

    1 Introduction

    Allegro bedeutet "Allegro Low Level Game Routines" und ist eine plattformunabhängige Bibliothek, die hauptsächlich dazu genutzt wird einfache Spiele zu erstellen[Im Ausmaß von Diablo oder den kleinen Mini-Raumschiff-Spielen]. Sie ist einfach zu handhaben und im prinzip sehr mächtig. Sie ist in C geschrieben.

    Was sie alles kann wird diese Liste zeigen:

    -Plattformunabhängigkeit
    -Grundkörper darstellen
    -Textausgabe
    -Benutzerdefinierte Fonts
    -Arbeiten mit Sprites
    -Soundausgabe
    -Joystickeingabe
    -Mausunterstützung
    -Timerfunktionen

    Mehr dazu hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39417.html

    2 Benötigtes

    Um Allegro nutzen zu können, benötigen Sie die Bibliothek. Diese ist hier erhältlich: http://alleg.sourceforge.net/wip.html

    Danach müssen Sie Allegro bekannt machen. Lesen Sie vor diesem Schritt die beiliegende Readme im Rar-Verzeichnis.

    Für Windows:

    fix mingw32
    make
    make install

    Für Linux:

    chmod +x fix.sh
    ./fix.sh unix
    ./configure
    make
    su -c "make install"
    su -c "make install-man"

    Falls es ärger gibt, könnt ihr hier nachgucken: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39446.html

    3 Die Materie

    Im ersten Teil dieses Tutorials werde ich auf Message Boxen, den Grafikmodus, das Zeichnen von Pixeln und das Anzeigen von Bildern eingehen.

    Allegro wird mit <allegro.h> inkludiert. Außerdem muss Allegro noch mit allegro_init() initialisiert und mit END_OF_MAIN() beendet werden.

    Also dieses Grundgerüst:

    #include <allegro.h>
    
    int main(int argc, char **argv[]){
       allegro_init();
    }END_OF_MAIN()
    

    Damit ist die Basis geschaffen. Fangen wir an.

    3.1 MessageBox

    Um eine einfache MessageBox auf den Bildschirm zu bringen[Alternativ einen Output auf die Console] benutzen wir

    void allegro_message("Visit www.c-plusplus.net");

    Diese Funktion ist vergleichbar mit der MessageBox der WinAPI.

    Hier ein Beispielprogramm, damit Sie sich orientieren können:

    //prgm1.cpp
    #include <allegro.h>
    
    int main(){
       allegro_init();
       allegro_message("Visit www.c-plusplus.net");
    }END_OF_MAIN();
    

    Auf Windows wir das so kompiliert:

    g++ prgm1.cpp -o prgm1.exe -lalleg

    Auf einem Linux-System in etwa so:

    g++ prgm1.cpp -o prgm1 'allegro-config --libs'

    3.2 Grafikmodus

    Zur Infomation: Es gibt zwei Möglichkeiten der Programmform: Vollbild und Fenstermodus. Allegro unterstützt alle Modi, welche die Hardware auch unterstützt. Daher: Farbtiefe und Auflösung.

    Die Funktion, um die Farbtiefe zu setzen lautet:

    void set_color_depth(int depth);

    Die Funktion für den eigentlichen Grafikmodus:

    int set_gfx_mode(int grafiktreiber,int w, int h, int v_w, int v_h);

    Der Grafiktreiber sollte auf diesen Default-Werten liegen:

    Der Graik-GFX_AUTODETECT
    -GFX_AUTODETECT_FULLSCREEN
    -GFX_AUTODETECT_WINDOWED

    w und h geben die Auflösung.

    v_w und v_h sind für die virtuelle Auflösung, die wir jedoch nicht benutzen und somit diese Werte auf , setzen.

    Falls der Grafikmodus fehlschlägt, gibt die Funktion einen Wert nicht größer-gleich 0 zurück.

    Falls Sie jetzt auf den Bildschirm zugreifen möchten, benutzen Sie die globale Variable screen.

    3.3 Pixel zeichnen

    Wir können unseren Bildschirm schon konfigurieren. Jetzt wollen wir Pixel setzen.

    Dies geschieht mit der Funktion:

    void putpixel(BITMAP *bmp, int x, int y, int color);

    bmp sollte unser Bildschirm, daher screen sein. x und y stehen für die Koordinaten. color für die Farbe, die mit der Funktion

    void makecol(rot,grün,blau)

    angegeben wird.

    Möchten wir also einen blauen Streifen zeichnen, so können wir dies so:

    //Die Schleife für die blaue Fläche
    for(int i = 0; i < 256; i++){
    for(int p = 0; p < 256; p++){
    putpixel(screen,i+200,p+200,makecol(0,0,255));
    }
    }

    /* Später noch über acquire_screen und release_screen schreiben */

    Da wir das haben, kommen wir zum Anzeigen von Bildern.

    3.3 Bilder anzeigen

    Allegro unterstützt vier Bildtypen. Das wären:

    -*bmp
    -*lbm
    -*pcx
    -*tga

    Eine Bitmap erstellen Sie mit:

    BITMAP *bitmap;

    Laden tuen Sie diese mit der Funktion

    void load_bitmap(const char *filename, RGB *rgb);

    , die einen Zeiger auf die Bitmap liefert oder NULL, falls der Vorgang nicht erfolgreich war.

    filename ist der Name der Bitmap und rgb ein Zeigen auf ein Array mit 256 RGB-Werten, den wir getrost auf NULL setzen können, da wir uns nicht im 256-Farben modus befinden und sicherlich nicht dorthin wollen.

    Wir haben die Bitmap im Speicher, aber erst mit der Funktion blit wird diese auf einer Bitmap dargestellt.

    /* Denke an doublebuffering */

    Diese Funktion hat folgende Syntax:

    void blit(BITMAP *source, BITMAP *dest, int sourceX, int sourceY, int destX, int destY, int width, int height);

    source ist die Bitmap mit dem Bild. destination im Normalfall screen.

    sourceY und sourceX bilden die obere linke Ecke des Bereiches, der angezeigt werden soll.

    destX und destY geben die Koordinaten an, an denen die Bitmap gezeichnet werden soll.

    width und height geben die Größe der Bitmap an. Dabei ist die Orginalgröße mit die_bitmap->w bzw. die_bitmap->h festzustellen.

    //Tip: Prüfen Sie immer zuerst, ob die Bitmap auf der Festplatte existiert, da blit sonst eine exception wirft.

    Hier noch ein Beispielprogramm, welches alle Funktionen, die wir bis jetzt kennengelernt haben nutzt:

    //prgm2.cpp
    #include <allegro.h>
    
    int main(){
       allegro_init();
       set_color_depth(32);
       if(!set_gfx_mode(GFX_AUTODETECT,1024,768,0,0)){
          allegro_message("Unable to set teh graficmode");
          exit(0);
       }
       for(int i = 0; i < 40; i++){
          for(int k = 0; k < 40; k++){
             putpixel(screen,i+200,k+200,makecol(255,0,0));
          }
       }
       BITMAP *bitmap = load_bitmap("c-plusplus.net.bmp",NULL);
       if(bitmap == NULL){
          allegro_message("Could not load c-plusplus.net.bmp");
          exit(0);
       }
       blit(bitmap,screen,0,0,(SCREEN_W - die_bitmap->w)/2,(SCREEN_H - die_bitmap->h)/2,
            die_bitmap->w,die_bitmap->h); 
    }END_OF_MAIN();
    

    4 Nachwort

    Wir haben uns mit den grundgelegenen Bildtechniken beschäftigt. Im nächten Teil[von 3] werden Sie lernen, wie man in Allegro mit der Tastatur arbeitet.

    MFG winexec*



  • Allegro Spielebibliothek

    Inhalt

    1. Introduction
    2. Benötigtes
    3. Die Materie
    3.1 MessageBox
    3.2 Grafikmodus
    3.3 Pixel zeichnen
    3.4 Bilder anzeigen
    4. Nachwort

    1 Introduction

    Allegro bedeutet "Allegro Low Level Game Routines" und ist eine plattformunabhängige Bibliothek, die hauptsächlich dazu genutzt wird einfache Spiele zu erstellen[Im Ausmaß von Diablo oder den kleinen Mini-Raumschiff-Spielen]. Sie ist einfach zu handhaben und im prinzip sehr mächtig. Sie ist in C geschrieben.

    Was sie alles kann wird diese Liste zeigen:

    -Plattformunabhängigkeit
    -Grundkörper darstellen
    -Textausgabe
    -Benutzerdefinierte Fonts
    -Arbeiten mit Sprites
    -Soundausgabe
    -Joystickeingabe
    -Mausunterstützung
    -Timerfunktionen

    Mehr dazu hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39417.html

    2 Benötigtes

    Um Allegro nutzen zu können, benötigen Sie die Bibliothek. Diese ist hier erhältlich: http://alleg.sourceforge.net/wip.html

    Danach müssen Sie Allegro bekannt machen. Lesen Sie vor diesem Schritt die beiliegende Readme im Rar-Verzeichnis durch.

    Für Windows:

    fix mingw32
    make
    make install

    Für Linux:

    chmod +x fix.sh
    ./fix.sh unix
    ./configure
    make
    su -c "make install"
    su -c "make install-man"

    Falls es ärger gibt, können Sie hier

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39446.html

    oder hier

    http://www.allegro.cc/resource/HelpDocuments/AllegroNewbie

    nachgucken

    3 Die Materie

    Im ersten Teil dieses Tutorials werde ich auf Message Boxen, den Grafikmodus, das Zeichnen von Pixeln und das Anzeigen von Bildern eingehen.

    Allegro wird mit <allegro.h> inkludiert. Außerdem muss Allegro noch mit allegro_init() initialisiert und mit END_OF_MAIN() beendet werden.

    Also dieses Grundgerüst:

    #include <allegro.h>
    
    int main(int argc, char **argv[]){
       allegro_init();
    }END_OF_MAIN()
    

    Damit ist die Basis geschaffen. Fangen wir an.

    3.1 MessageBox

    Um eine einfache MessageBox auf den Bildschirm zu bringen[Alternativ einen Output auf die Console] benutzen wir:

    void allegro_message("Visit www.c-plusplus.net");

    Diese Funktion ist vergleichbar mit der MessageBox der WinAPI.

    Hier ein Beispielprogramm, damit Sie sich orientieren können:

    //prgm1.cpp
    #include <allegro.h>
    
    int main(){
       allegro_init();
       allegro_message("Visit www.c-plusplus.net");
    }END_OF_MAIN();
    

    Auf Windows wir das so kompiliert[Ich gehe vom GCC-Minimalist aus]:

    g++ prgm1.cpp -o prgm1.exe -lalleg

    Auf einem Linux-System in etwa so:

    g++ prgm1.cpp -o prgm1 'allegro-config --libs'

    3.2 Grafikmodus

    Zur Infomation: Es gibt zwei Möglichkeiten der Programmform: Vollbild und Fenstermodus. Es werden alle Farbtiefen und Auflösungen der Hardware unterstützt.

    Die Funktion, um die Farbtiefe zu setzen lautet:

    void set_color_depth(int depth);

    Die Funktion für den eigentlichen Grafikmodus:

    int set_gfx_mode(int grafiktreiber,int w, int h, int v_w, int v_h);

    Der Grafiktreiber sollte auf diesen Default-Werten liegen:

    -GFX_AUTODETECT
    -GFX_AUTODETECT_FULLSCREEN
    -GFX_AUTODETECT_WINDOWED

    w und h geben die Auflösung.

    v_w und v_h sind für die virtuelle Auflösung, die wir jedoch nicht benutzen und somit diese Werte auf 0 setzen.

    Falls der Grafikmodus fehlschlägt, gibt die Funktion einen Wert nicht größer-gleich 0 zurück.

    Falls Sie jetzt auf den Bildschirm zugreifen möchten, benutzen Sie die globale Variable screen.

    3.3 Pixel zeichnen

    Wir können unseren Bildschirm schon konfigurieren. Jetzt wollen wir Pixel setzen.

    Dies geschieht mit der Funktion:

    void putpixel(BITMAP *bmp, int x, int y, int color);

    bmp sollte unser Bildschirm, daher screen sein. x und y stehen für die Koordinaten. color für die Farbe, die mit der Funktion

    void makecol(rot,grün,blau)

    angegeben wird.

    Möchten wir also einen blauen Streifen zeichnen, so können wir dies so:

    //Die Schleife für die blaue Fläche
    for(int i = 0; i < 256; i++){
       for(int p = 0; p < 256; p++){
          putpixel(screen,i+200,p+200,makecol(0,0,255));
       }
    }
    

    /* Später noch über acquire_screen und release_screen schreiben */

    Da wir das haben, kommen wir zum Anzeigen von Bildern.

    3.3 Bilder anzeigen

    Allegro unterstützt vier Bildtypen. Das wären:

    -*bmp
    -*lbm
    -*pcx
    -*tga

    Eine Bitmap erstellen Sie mit:

    BITMAP *bitmap;

    Geladen werden diese mit der Funktion:

    void load_bitmap(const char *filename, RGB *rgb);

    Diese gibt einen Zeiger auf die Bitmap zurück wenn erfolgreich oder NULL, falls der Vorgang fehlschlug.

    filename ist der Name der Bitmap und rgb ein Zeigen auf ein Array mit 256 RGB-Werten, den wir getrost auf NULL setzen können, da wir uns nicht im 256-Farben-Modus befinden und sicherlich nicht dorthin wollen.

    Wir haben die Bitmap im Speicher, aber erst mit der Funktion blit wird diese auf einer Bitmap dargestellt.

    /* Denke an doublebuffering */

    Diese Funktion hat folgende Syntax:

    void blit(BITMAP *source, BITMAP *dest, int sourceX, int sourceY, int destX, int destY, int width, int height);

    source ist die Bitmap mit dem Bild. destination im Normalfall screen.

    sourceY und sourceX bilden die obere linke Ecke des Bereiches, der angezeigt werden soll.

    destX und destY geben die Koordinaten an, an denen die Bitmap gezeichnet werden soll.

    width und height geben die Größe der Bitmap an. Dabei ist die Orginalgröße mit die_bitmap->w bzw. die_bitmap->h festzustellen.

    //Tip: Prüfen Sie immer zuerst, ob die Bitmap auf der Festplatte existiert, da blit sonst eine exception wirft.

    Hier noch ein Beispielprogramm, welches alle Funktionen, die wir bis jetzt kennengelernt haben nutzt:

    //prgm2.cpp
    #include <allegro.h>
    
    int main(){
       allegro_init();
       set_color_depth(32);
       if(!set_gfx_mode(GFX_AUTODETECT,1024,768,0,0)){
          allegro_message("Unable to set teh graficmode");
          exit(0);
       }
       for(int i = 0; i < 40; i++){
          for(int k = 0; k < 40; k++){
             putpixel(screen,i+200,k+200,makecol(255,0,0));
          }
       }
       BITMAP *bitmap = load_bitmap("c-plusplus.net.bmp",NULL);
       if(bitmap == NULL){
          allegro_message("Could not load c-plusplus.net.bmp");
          exit(0);
       }
       blit(bitmap,screen,0,0,(SCREEN_W - die_bitmap->w)/2,(SCREEN_H - die_bitmap->h)/2,
            die_bitmap->w,die_bitmap->h); 
    }END_OF_MAIN();
    

    4 Nachwort

    Wir haben uns mit den grundgelegenen Bildtechniken beschäftigt. Im nächten Teil[von 3] werden Sie lernen, wie man in Allegro mit der Tastatur arbeitet.

    MFG winexec*



  • Hallo,

    Bevor ich mich wohlmöglich an einen zweiten oder dritten Teil mache: Sind drei Teile für solch eine Bibliothek nicht zuviel? Sollten es zwei werden?

    MFG winexec*



  • Hallo

    Ich will mal Feedback geben. Ich finde, dass sich das sehr interessant anhört und wahrscheinlich gut für Neueinsteiger in die Spielprogrammierung geeignet ist. Da ist man ja immer auf der Suche nach guten deutschen Tutorial und deswegen finde ich, dass du ruhig noch weitere Teile schreiben kannst. Vielleicht gibt es ja auch noch Wrapperklassen um Allegro, die du ja kurz vorstellen könntest (nur Name und für was sie da sind) Das fand ich bei SDL immer sehr praktisch.

    chrische



  • Naja, meines Wissens gibts da allgemein nicht so viel zu wrappen, da Allegro ja schon sehr vereinfacht und direkt ist.
    Aber interessant wäre,wenn du zu Input kommst, dass du da z.B. so eine allgemeine Klasse erstellst, mit der man allgemein Eingaben entgegen nehmen kann, nicht nur z.B. von der Tastatur, sondern z.B. auch von der Maus oder von nem Gamepad usw...
    Weiterhin interesant wären bestimmt die Allegro-Timer mit der man konstante Frameraten erreichen kann; wird ja oft nicht richtig verstanden.



  • Hallo,

    Einhabemöglichkeiten sollen im zweiten Teil vorkommen. Außerdem noch Beispiele, wie man gescheit Teile baut[Menüs]. Timer kann ich dann auch noch dran nehmen.

    MFG winexec*



  • Achso nochwas, was mir eingefallen ist.
    Allegro unterstützt von Haus aus die von dir 4 genannten Bildtypen, es gibt aber auch Zusatzbibliotheken, womit man genauso mit PNGs, JPGs und GIFs arbeiten kann. Solltest du evtl. noch erwähnen.


Anmelden zum Antworten