Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++

Ähnliche Präsentationen


Präsentation zum Thema: "V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++"—  Präsentation transkript:

1 V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++

2 class ultris { private: … int speed; // aktuelle Geschwindigkeit gespeichert DWORD time // Zeitpunkt der letzten Aktualisierung int onestep(); // Bewegt Form einen Pixel nach unten int blockiert(); // Prüft ob unter der Form noch Platz ist … public: … int step(); // Bringt Spiel zum laufen void down(); // Durch Drücken der Leertaste wird Die Form fallen gelassen void reset_timer(); { time = timeGetTime(); } // aktuelle Zeit (Systemzeit in ms) void schneller(); {speed += 50;} // Geschwindigkeit erhöht void langsamer(); { if (speed > 50) speed -= 50;} // Geschwindigkeit verlangsamt … }

3 Beim Start: void ultris::start() { … reset_timer(); // Zeitreferenz wird initialisiert speed = 100; // Anfangsgeschwindigkeit wird auf 100 gesetzt }

4 Fallende Form befindet sich immer in einer Zeile und fällt Pixel für Pixel herab Ein sogenanntes Offset wird zum Zeilenzähler hinzugezählt Eine Zeile sind 20 Pixel => Offset kann Werte von 0 bis 19 haben. Immer wenn Offset Null ist ist die Form genau im Raster

5 int ultris::onestep() { if (offset) //Wenn das Offset nicht Null ist befinden wir uns zwischen zwei Zeilen { if (offset < 19) offset++;// Offset kann erhöht werden else {offset = 0; zeile++;} // Form kommt in die nächste Zeile return 1;// hat geklappt } else // Form ist genau in einer Zeile { if (blockiert()) // ist unterhalb der Form noch Platz? { ultris_sounds.play (sound_down); // Aufprallklang neue_form(); // Nächste Form return 0;} // hat nicht geklappt offset++; // Offset kann erhöht werden return 1; // hat geklappt}

6 int ultris:: blockiert() { int z, s, zz; for (z=0; z h; z++) // jede Zeile der Form { for (s=0; s b; s++) // jede Spalte der Form { if (aktuelle_form()->data[z][s]) // wenn entsprechendes Segment gesetzt ist { zz = zeile + z +1; // Spielfeldsegment unter Formsegement if ((zz>=20) || // Wenn die Form am unteren Rand ist ((zz>=0 && (spielfeld[zz][spalte+s]))) // Wenn das Spielfeldsegment unter dem Formsegment gesetzt ist return 1; // Form wird blockiert }}} return 0; // Form wird nicht blockiert }

7 void ultris::down() { while(onestep()); // solange onestep aufgerufen solange die Form nicht blockiert ist } Die Funktion wird aufgerufen wenn der Benutzer die Leertase drückt

8 int ultris::step() { DWORD now; int pixel; int diff now =timeGetTime();// Systemseit in ms wird ermittelt diff = (now-time)*speed;// Berechnung der Strecke pixel =diff/5000; // Wie viele Pixel muss die Form herunterfallen? if (!pixel) return 0;// Keine Bewegung nach unten time = now – diff%5000/speed; // Zeitreferenz wird auf die aktuelle Zeit gesetzt, Zeit // um die Millisekunden zurückgesetzt, die wegen Intergerdivision unberücksichtigt //gebleiben sind for( ;pixel && onstep(); pixel--); // Berechnete Anzahl von Schritten wird ausgeführt return 1; }

9 LRESULT CALLBACK ultris_windowhandler(…) { … case ID_INFO_HILFE: dialogBox(…) mein_spiel.reset_timer(); // Timer wird zurückgesetzt damit Spiel nicht weiterläuft return 0; case ID_INFO_ULTRIS: dialogBox(…) mein_spiel.reset_timer(); // Timer wird zurückgesetzt damit Spiel nicht weiterläuft return 0; case ID_EINSTELLUNGEN_KONFIGURATION: dialogBox(…) mein_spiel.reset_timer(); // Timer wird zurückgesetzt damit Spiel nicht weiterläuft return 0; … case WM_EXITMENULOOP: case WM_EXITSIZEMOVE: mein_spiel.reset_timer(); // Timer wird zurückgesetzt damit Spiel nicht weiterläuft break; }

10 LRESULT CALLBACK ultris_windowhandler(…) { … case ID_ULTRIS_PAUSE: // Akzellerator für Pause Befehl auf F2 mein_spiel.spiel_laeuft=!mein_spiel.spiel_laeuft; CheckMenuItem (ultris_menu, ID_ULTRIS_PAUSE, mein_spiel.spiel_laeuft ? MF_UNCKECKED:MF_CHECKED); return 0; case IDM_DOWN:// Durch Drücken der Leertaste if (mein_spiel.spiel_laeuft) mein_spiel.down(); return 0; case IDM_SCHNELLER:// Akzellerator für Schneller Befehl auf F3 mein_spiel.schneller(); return 0; case IDM_LANGSAMER:// Akzellerator für Langsamer Befehl auf F4 mein_spiel.langsamer(); return 0; … }

11 int APIENTRY WinMain(…) {… while (TRUE) { if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) else { HRESULT hr; hr= ultris_display.cooperative(); if (hr<0)… else { if (mein_spiel.spiel_laeuft) // Regelmäßiges Aufrufen von step um das Spiel zum laufen zu bringen { if (mein_spiel.step()) mein_spiel.display();} else {WaitMessage(); mein_spiel.reset_timer();} }}}}


Herunterladen ppt "V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++"

Ähnliche Präsentationen


Google-Anzeigen