Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Ernsta Schleis Geändert vor über 11 Jahren
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 16 2. 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 + 4 - 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
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.