Inhaltsverzeichnis

Das Spiel

So jetzt haben wir schon mal eine Grundlage geschaffen, um unser Spiel halbwegs komfortabel zu bedienen. Jetzt können wir ja zum eigentlichen Spiel kommen :) Das Bedeutet, dass wir jetzt mit der 2ten Klasse (MainGame) beginnen.

Der Header

Den müsstet ihr eigentlich schon haben, der war ganz am Anfang in der 4Gewinnt.h drin.

Der Konstruktor

So, wie ihr euch sicher Denken könnt muss man für das Spiel wieder einiges im vorraus laden. Das passiert dann im Konstruktor, und der sieht so aus:

MainGame::MainGame(){
    Ziel = create_bitmap(SCREEN_W,SCREEN_H);
 
    BITMAP *Temp = load_bitmap(".\\Resources\\pointer.bmp", NULL);
    BITMAP *Temp2 = create_bitmap(Temp->h, Temp->w);
    clear_to_color(Temp2,makecol(255,0,255));
    rotate_sprite(Temp2,Temp, -(Temp->w - Temp->h)/2, (Temp->w - Temp->h)/2, itofix(64));
 
    Pointer = new TGRAPHIKOBJEKT(Temp2);
    Pointer->ZielSetzen(Ziel);
 
    destroy_bitmap(Temp);
    Temp = Temp2 = NULL;
 
    Temp = createRectangle(490 + 80, 420 + 70, makecol(0,0,255));
    Temp2 = createCircle(70, makecol(255,0,255), makecol(0,0,255));
 
    for(int i = 0; i < 7;i++){
        for( int k = 0; k < 6;k++){
            Feld[i][k].Belegt = false;
            Feld[i][k].Player = 3;
            blit(Temp2, Temp, 0,0,i*70 + (i+1)*10,k*70 + (k+1)*10, 70, 70);
        }
    }
    destroy_bitmap(Temp2);
 
    FeldPic = new TGRAPHIKOBJEKT(Temp);
    FeldPic->ZielSetzen(Ziel);
    FeldPic->PositionSetzen((SCREEN_W-580)/2, SCREEN_H-500);
 
    Steine[0] = new TGRAPHIKOBJEKT(".\\Resources\\Stein1.bmp");
    Steine[0]->ZielSetzen(FeldPic->get_Bild());
    Steine[1] = new TGRAPHIKOBJEKT(".\\Resources\\Stein2.bmp");
    Steine[1]->ZielSetzen(FeldPic->get_Bild());
 
    Temp = Temp2 = NULL;
 
    GameHintergrund = new TGRAPHIKOBJEKT(".\\Resources\\GameHintergrund.bmp");
    GameHintergrund->ZielSetzen(Ziel);
 
    Sieg = new TFONT();
    Sieg->ZielSetzen(screen);
    Sieg->PositionSetzen(0,0);
 
    for (int i = 0; i < 2; i++){
        Player[i] = new TFONT();
        Player[i]->ZielSetzen(Ziel);
    }
 
    beenden = false;
    PlayersTurn = 0;
    Gewinner = 3;
 
}

So ich werde diesesmal nur die Codeabschnitte erklären, die nicht sofort offensichtlich sind:

    BITMAP *Temp = load_bitmap(".\\Resources\\pointer.bmp", NULL);
    BITMAP *Temp2 = create_bitmap(Temp->h, Temp->w);
    clear_to_color(Temp2,makecol(255,0,255));
    rotate_sprite(Temp2,Temp, -(Temp->w - Temp->h)/2, (Temp->w - Temp->h)/2, itofix(64));
 
    Pointer = new TGRAPHIKOBJEKT(Temp2);
    Pointer->ZielSetzen(Ziel);

So das ganze dient jetzt dazu, den Zeiger, ihr erinnert euch, dieser Finger, in die Richtige Position zu bringen. Von alleine Zeigt er nach Rechts, aber wir brauchen ihn jetzt nach unten Zeigend, um die Spalte auszuwählen, in die Später der Stein fallen soll. Deswegen laden wir erst Pointer, erzeugen dann ein Bitmap, das die Breite der Länge des Pointer hat, und umgekehrt. Wir haben jetzt also ein Bitmap, dass so groß ist, wie das des pointer, nur auf die Seite gedreht. Das wird dann mit Rosa gefüllt, weil das durchsichtig ist. Dann wird der Pointer gedreht. Erstes Parameter ist das Ziel, das zweite die Quelle, das dritte der X-Wert, der 4te der Y-Wert, und das Letzte, sagt, wie viel das Bild gedreht werden soll, vobei allegro da ein etwas merkwürdigen Datentyp verwendet, nämlich fix. Naja, wenn man das mit der Funktion umrechnen will, muss man halt darauf achten, dass 255 einer 360°-Drehung entspricht, dementsprechend, sind 64 eine 90°-Drehung.

 Temp = createRectangle(490 + 80, 420 + 70, makecol(0,0,255));
 Temp2 = createCircle(70, makecol(255,0,255), makecol(0,0,255));

Fange ich mit dem createCircle an, Es wird ein Quadratisches Bitmap mit der Kantenlänge 70 erstellt, und ein kreis mit dem Durchmesser 70 darein gemalt. dabei ist das 2te Parameter die innere und das dritte Parameter die äußere Farbe:

Innen habe ich es weiß gelassen, weil Rosa ja bei uns Durchsichtig ist. So dass 4-Eck was dadrüber erstellt wird ist unser Hintergrund. Die Parameter sind einfach: Länge, Höhe, und Farbe. Wie lang muss es sein? Naja also solang, dass 7 Steine hineinpassen. ein Stein kommt in ein Rundes Loch, also 7*70 = 490, aber halt das reicht nicht, denn dann würden sich die löcher ja berühren, als bekommt jedes Loch noch einen 10 Pixelbreiten Rand, und da wir es auf beiden Seiten um die Löcher drumherumhaben wollen, brauchen wir noch einen Rand mehr, also + 80 Pixel. Die höhe wird nach dem Selben Prinzip errechnet.

    for(int i = 0; i < 7;i++){
        for( int k = 0; k < 6;k++){
            Feld[i][k].Belegt = false;
            Feld[i][k].Player = 3;
            blit(Temp2, Temp, 0,0,i*70 + (i+1)*10,k*70 + (k+1)*10, 70, 70);
        }
    }

So hier wird unten nach Oben und von Lins nach rechts, durch das Spielfeld geganden, und dann immer im selben abstand, ein Loch auf Unser blaues Rechteck gesetzt, sodass Man am ende schön das 4-Gewinnt feld hat. (Es wird immer der Abstand der Größe der Kreise genommen, plus einen Rand, und weil es erst mit nem Rand Losgeht wird immer der nächste Rand berechnet.

Der Rest des Codes sollte selbserklärend sein. Der Grund, dass als Hintergrund ein Grünes Bitmap geladen wird, anstelle eines zu erstellen und grün zu färben ist, dass ich ursprünglich im Nachhinein noch ein Anderes Hintergrundbild einfügen wollte.

Hier gehts zurück und Hier gehts weiter