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

Slides:



Advertisements
Ähnliche Präsentationen
Klassen - Verkettete Liste -
Advertisements

Forschungszentrum caesar
Sortieren I - Bubblesort -
Suche in Texten (Stringsuche )
der Universität Oldenburg
Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.
VO2 Laden und Initialisieren der Sounds. Wir wollen Sounds in unsere Applikation laden Menü erweitern –um den Menüpunkt Sound –mit dem Identifier ID_ULTRIS_SOUND.
Ultris Version 8: Erzeugen der Formen und Anzeigen der Vorschau
Ultris V10 Bewegen, Drehen und Kollisionserkennung.
V11 Auflösen der Formen und Abräumen der Reihen. Zwei neue Methoden ___________________________________ class ultris { private: … void aufloesen(); void.
SWITCH - Anweisung.
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
DO...WHILE Anweisung.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
V10 - Kollisionen Nicolas Matentzoglu. Inhalt der Präsentation Kollisionserkennung bei Hindernissen Verhalten der Kugel über verschiedenen Untergründen.
V03 Laden und Initialisieren der Grafiken - Grafiken des Spiels laden und testweise auf dem Bildschirm anzeigen - eine Klasse anlegen, die alle erforderlichen.
V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)
Softwaretechnologie II WS 08/09 SpieleProgrammieren UlTris V07 Reihen vorbelegen, Spielfeld anzeigen und Punktestand ausrechnen Sibylle C. Schellhorn,
Vers. 6: Der Konfigurationsdialog Quelle: Spieleprogrammierung mit DirectX und C++, U. Kaiser und P. Lensing, Galileo Computing (2007)
Spieleprogrammierung mit DirectX und C++
V03 Laden und Speichern von Spielfeldern und der Spielfeldeditor.
V11 Auflösen der Formen Abräumen der Reihen. Erweiterung der Klasse ultris class ultris { private: … void aufloesen() void aufruecken() public: … }
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Zusammenfassung Vorwoche
Thema des Informatikkurses der Klasse 8
DVG Ablaufsteuerung
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Schleifen mit der Turtle
Informatik Grundkurse mit Java
Informatikunterricht mit Java
3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Rekursive Funktionen (Fakultät)
Java programmieren mit JavaKara
Guten Nachmittag!.
Wir haben gesehen Das Gerüst ist bei JavaKara fix vorgegeben
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Parallel Matrix Multiplication
Informatik 1 Letzte Übung.
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Grundkonzepte des Programmierens (mit ActionScript)
LEGO NXT Roboter in Java programmieren
Variablen. var meineZahl:Number = 7; meineZahl 7 Name TypWert = Zuweisung von Variablen.
Parallelisierung für Multiprozessor-Maschinen
Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt.
Programmiervorkurs WS 2014/15 Schleifen
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
early binding (frühe Bindung) late binding (späte Bindung)
Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Klassen und Objekte.
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Visual Rekapitulation Tag 1
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
TRUE und FALSE in C Der Wert 0 steht für FALSE Jeder von 0 verschiedene Wert steht für TRUE FALSE wird als 0 dargestellt TRUE wird als 1 dargestellt.
1.Event Queue.
Rekursion – Speicherverwaltung
Zwei Denkansätze zur Klasse Schlange
Bewegung des Pacman.
Kniffelergebnisse.
 Präsentation transkript:

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

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 … }

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

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

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}

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 }

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

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; }

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; }

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; … }

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();} }}}}