Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)

Ähnliche Präsentationen


Präsentation zum Thema: "V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)"—  Präsentation transkript:

1 V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)

2 Identifier: IDM_DREHRECHTS IDM_DREHLINKS IDM_RECHTS IDM_LINKS Jeder Identifier wird für 2 Tasten verwendet Identifier werden später im Callback-Handler eingefügt Benutzerschnittstelle Akzelleratoren anlegen

3 LRESULT CALLBACK ultris_windowhandler(…) {... case IDM_DREHRECHTS: mein_spiel.drehen(1); return 0; case IDM_DREHLINKS: mein_spiel.drehen(-1); return 0; case IDM_RECHTS: mein_spiel.bewegen(1); return 0; case IDM_LINKS: mein_spiel.bewegen(-1); return 0;... } Zahl als Übergabewert

4 Neue Methoden der Klasse class ultris: void bewegen( int dir); // -1 eins nach links +1 eins nach rechts void drehen(int dir); // -1 eins nach links +1 eins nach rechts Übergabewerte in der Variable dir werden zur Steuerung verwendet

5 void ultris::bewegen( int dir) // -1 eins nach links +1 eins nach rechts { int z, s, // Zeile und Spalte im Spielstein int neue_spalte; const form *f; f = aktuelle_form(); //aktuelle Form wird geholt neue_spalte = spalte + dir; //Berechnung der neuen Spaltenposition if( neue_spalte < 0) return; if( neue_spalte + f->b > 10) return; // Abbruch, falls neue Position außerhalb des Spielfelds Bewegung

6 for( z = 0; z h; z++) //Durchlaufen der Zeilen { if( zeile+z < 0) continue; // falls Zeile noch unterhalb der Abdeckung, keine weiteren Prüfungen for( s = 0; s b; s++) //alle Spalten der Zeile durchlaufen { if( f->data[z][s]) //befindet sich in der aktuellen Zeile und Spalte der Form ein Segment (1), wird weiter geprüft { if( (offset < 16) && spielfeld[zeile+z][neue_spalte+s]) return; //Bedingungen, unter denen keine Bewegung ausgeführt wird: 1. Offset ist kleiner als Spalte neben betrachteten Segment ist belegt

7 Wichtig: Spalte neben Segment muss immer frei sein Begrenzung auf ein Offset unter 16 schafft ein ausreichend großes Zeitfenster, um Segmente in Lücken einzuschieben. if( (offset < 16) && spielfeld[zeile+z][neue_spalte+s]) Je kleiner die Offset-Grenze, desto früher kann man den Spielstein verschieben.

8 if( (offset > 0) && spielfeld[zeile+z+1][neue_spalte+s]) return; // Ist das Offset größer als 0, muss auch die nächste Zeile der benachbarten Spalte frei sein, damit Bewegung nicht abgebrochen wird. } spalte = neue_spalte; ultris_sounds.play( sound_move); } // Letztendlich wird neue Spaltenposition übernommen, falls alle Tests überstanden wurden.

9 alle Steine werden überprüft bei komplizierteren Formen wäre es schwierig, die vordersten Segmente auszumachen

10 Drehung void ultris::drehen(int dir) { int sv, sp, zl; int b1, b2, h1, h2, db, dh; int maxb, maxh, minz, mins; int i, j; sv = (formen[0].dv dir)%4; // Index der gesuchten Drehvariante wird bestimmt

11 b1 = aktuelle_form()->b; b2 = ultris_form[formen[0].ix][sv]->b; h1 = aktuelle_form()->h; h2 = ultris_form[formen[0].ix][sv]->h; //Breite und Höhe der aktuellen Form und der Drehvariante werden ermittelt db = (b1-b2)/2; dh = (h1-h2)/2; sp = spalte+db; zl = zeile+dh; //Drehung der Form um den Mittelpunkt Halbe Höhen- und Breitendifferenz (db und dh) ergibt die neue Zeile (z1) und Spalte (z2)

12 if( sp < 0) sp = 0; if( sp+b2 >= 10) sp = 10-b2; //Gedrehte Form soll nicht außerhalb des Spielfeldes liegen if( zl+h2 >= 20) return; //Keine Drehung, wenn Figur unten aus dem Spielfeld ragt mins = spalte < sp ? spalte : sp; minz = zeile < zl ? zeile : zl; maxb = b1 > b2 ? b1 : b2; maxh = h1 > h2 ? h1 : h2; if( offset) maxh++; //Bestimmung des Bereichs, der für die Drehung frei sein muss (rechteckiger Bereich, um die Form)

13 for( i = minz; i < minz+maxh; i++) { for( j = mins; j < mins+maxb; j++) { if( (i>=0)&&(i =0)&&(j<10)&&spielfeld[i][j]) return; } //Befindet sich ein Stein im Weg, erfolgt der vorzeitige Rücksprung formen[0].dv = sv; spalte = sp; zeile = zl; ultris_sounds.play( sound_dreh); } //Wenn alle Prüfungen überstanden sind, wird die Drehvariante übernommen und der Drehsound abgespielt


Herunterladen ppt "V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)"

Ähnliche Präsentationen


Google-Anzeigen