Ultris V10 Bewegen, Drehen und Kollisionserkennung.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Sortieren I - Bubblesort -
Konzepte objektorientierter Systeme
Kapselung , toString , equals , Java API
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
5. Sortier-Algorithmen Vorbemerkungen:
V04: Definition und Implementierung der Formen. Spieler kann aus Gesamtzahl von 35 Steinen seine Spielsteine wählen Einheitliche Datenstruktur wird benötigt,
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
V11 Auflösen der Formen und Abräumen der Reihen. Zwei neue Methoden ___________________________________ class ultris { private: … void aufloesen(); void.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
V10 - Kollisionen Nicolas Matentzoglu. Inhalt der Präsentation Kollisionserkennung bei Hindernissen Verhalten der Kugel über verschiedenen Untergründen.
V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)
V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++
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: … }
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
3.1.4 Leser/Schreiber-Ausschluß (reader/writer exclusion)
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Programmiermethodik Übung 6 Methoden verstehen und entwerfen (erstmal ohne Computer)
Der C-Präprozessor EDV1 - 04Präprozessor.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Struktogramme IF-ELSE FOR – Schleife
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)
Hanjie Hanjie Hanjie ist ein japanisches Bilderpuzzle, das aus dem späten 18. Jahrhundert stammt. Jedes Hanjie besteht.
Grundkonzepte Java - Klassendefinition
Rekursive Funktionen (Fakultät)
Java programmieren mit JavaKara
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Guten Nachmittag!.
Wir haben gesehen Das Gerüst ist bei JavaKara fix vorgegeben
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Informatik 1 Letzte Übung.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Aufruf einer Methode eines Objektes vom Typ „Bruch“
Purga - Scriptengine Ein Einblick.
Lösen von quadratischen Ungleichungen
Den Internet – Link, unter welchem der Blog zu finden ist kopieren.
Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt.
Programmiervorkurs WS 2014/15 Methoden
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
early binding (frühe Bindung) late binding (späte Bindung)
Selection-Sort Insertion-Sort Bubble-Sort.
1 // Heap als ADT // JW: V1.0 // Vorlage gemaess EED-Quelltext // #include #include // für double pow (double d, int i) #include // fuer INT_MIN.
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
ROBERT NYSTROM GAME PROGRAMMING PATTERNS III.8 Thema: Sequencing Patterns Seminar: Softwaretechnologie II (Teil 2) Dozent: Prof. Dr. Manfred Thaller Referent:
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
JAVA lernen: Methoden.
Nksainf.ch/oinf.
Grundkurs Informatik mit Java
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
 Präsentation transkript:

Ultris V10 Bewegen, Drehen und Kollisionserkennung

Akzelleratoren einbinden Steuerung der Formen mit den Richtungstasten oder mit J, K, L und I. Einfügen der Akzelleratoren über den Ressourcen-Editor: jeweils zwei Akzelleratoren haben die gleiche ID

Neue Methoden hinzufügen class ultris { … public: … void bewegen (int dir); void drehen (int dir); }; Richtung der Drehung/Bewegung: +1 für rechts -1 für links

Bewegen void ultris::bewegen (int dir) { int z, s, neue_spalte; const form *f; f = aktuelle_form(); neue_spalte = spalte + dir; if (neue_spalte < 0) return; if (neue_spalte + f->b >10) return; aktuelle Form wird geholt neue Spalte (also die Spalte nach der Bewegung) wird berechnet falls die neu berechnete Spalte außerhalb des Spielfeldes liegt, ist die Bewegung nicht möglich und es erfolgt ein vorzeitiger Rücksprung

for (z=0; z h; z++) { if (zeile+z < 0) continue; for (s=0; s b; s++) { jede Zeile der Form wird untersucht befindet sich die zu untersuchende Zeile noch unter der Abdeckung, wird diese einfach ignoriert jede Spalte der Form wird untersucht für jede Spalte finden nun Prüfungen statt, die alle erfolgreich sein müssen, damit die Bewegung ausgeführt werden kann schlägt eine Prüfung fehl Rücksprung keine Bewegung

if (f->data[z] [s]) { if ((offset < 16) && spielfeld[zeile+z][neue_spalte+s]) return; if ((offset > 0) && spielfeld[zeile+z+1][neue_spalte+s]) return; } Prüfung 1: befindet sich an dieser Stelle der Form ein Segment? Prüfung 2: ist der Bereich neben dem Segment frei? Prüfung 3: ist der Bereich darunter frei?

Prüfung 2 prüft, ob sich neben dem Segment ein Stein befindet. Falls ja, dann ist die Prüfung nicht bestanden und es erfolgt ein vorzeitiger Rücksprung. Aber: Falls das offset größer als oder gleich 16 ist, gilt die Prüfung trotzdem als bestanden, auch wenn sich daneben ein Stein befindet. Dies erleichtert es, den Stein in eine Lücke rein zu bewegen.

falls alle Prüfungen bestanden wurden, das heißt, falls es keinen vorzeitigen Rücksprung gab, kann die Bewegung ausgeführt werden spalte = neue_spalte; ultris_sounds.play(sound_move); }

Drehen 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; b1 = aktuelle_form()->b; b2 = ultris_form[formen[0].ix][sv]->b; h1 = aktuelle_form()->h; h2 = ultris_form[formen[0].ix][sv]->h; neue Drehvariante wird bestimmt und in der Variablen sv gespeichert neue und alte Breiten und Höhen werden bestimmt

db = (b1-b2)/2; dh = (h1-h2)/2; sp = spalte + db; zl = zeile + dh; if (sp < 0) sp = 0; if (sp + b2 >= 10) sp = 10 - b2; if (zl + h2 >= 20) return; durch eine Rechnung werden die Spalte und Zeile der Form nach der Drehung bestimmt (im Beispiel bleiben sie gleich, da db und dh = 0) sorgt dafür, dass die Form innerhalb des Spielfeldes bleibt ist die Form schon zu weit unten, ist keine Drehung möglich

mins = spalte < sp ? spalte : sp; minz = zeile < zl ? zeile : zl; maxb = b1 > b2 ? b1 : b2; maxh = h1 > h2 ? h1 : h2; if (offset) maxh++; for (i = minz; i < minz + maxh; i++) { for (j = mins; j < mins + maxb; j++) { if ((i>=0) && (i<20) && (j<10) && spielfeld[i][j]) return; } der Bereich, der für die Drehung frei sein muss wird berechnet nötiger Drehbereich wird Zeile für Zeile, Spalte für Spalte geprüft, ob er frei ist wenn nicht, dann erfolgt ein Rücksprung

formen[0].dv = sv; spalte = sp; zeile = zl; ultris_sounds.play(sound_dreh); } die Form wird letztendlich gedreht, indem die neue Drehvariante zugewiesen und die neue Zeile und Spalte gesetzt wird

Einbindung in die Benutzerschnittstelle LRESULT CALLBACK ultris_windowhandler(...) { switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) {... 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;...} break;...}...}