3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.

Slides:



Advertisements
Ähnliche Präsentationen
Strukturen in C Spelz, Sievers, Bethke.
Advertisements

Klassen - Verkettete Liste -
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Funktionen und Module Einführung anhand des Beispiels Wörter sortieren Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
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.
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
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)
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,
Tag 2 Look-up-Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung Quelle: 3D-Spiele mit C++ und DirectX in 21 Tagen, Alexander.
V12 Highscores WS 2009/10 Simulation und 3D Programmierung Prof. Dr. Manfred Thaller Martina Hänsel.
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 Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Einführung in Visual C++
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Klassen und Objekte
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Balance V01 Der Windows-Rahmen S Vortrag von Lisa Rau.
Einfach verkettete Listen (OOP)
Anlegen von Ordnern, speichern und Öffnen von Bildern und Briefen
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
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.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 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
Dynamische Datentypen
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 5 Dr. W. Narzt u. Dr. A. Stritzinger.
Die Klasse String und ihre Methoden
Aufruf einer Methode eines Objektes vom Typ „Bruch“
EPROG Tutorium #3 Philipp Effenberger
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
A Workshop About this chapter General description Units Time Schedule
Visual Rekapitulation Tag 1
ROBERT NYSTROM GAME PROGRAMMING PATTERNS III.8 Thema: Sequencing Patterns Seminar: Softwaretechnologie II (Teil 2) Dozent: Prof. Dr. Manfred Thaller Referent:
C++ FÜR cOMPUTERSPIELENTWICKLER
Rekursion – Speicherverwaltung
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
«Delegierter» Methoden Schablone Funktionszeiger
Implementieren von Klassen
 Präsentation transkript:

3D Programmierung Version 12 - Highscores

Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die Highscore-Liste eingetragen 1.) Die 5 Highscores werden in einer externen Datei abgelegt -> ul_high.dat

Die Highscores werden in einem einfachen Format abgespeichert: ,Phil Marlowe ,Sam Spade ,Lew Archer ,Inspector Columbo ,Ulrich Kaiser

2.) Die Highscore-Tabelle als eigenständige Klasse class highscore class highscore { struct score { int punkte; char name[40]; }; private: score high[5]; public: highscore(); // Konstruktor int get_score( int i){ return high[i].punkte;} // liest Punktzahl aus Tabelle const char *get_name( int i){ return high[i].name;} // liest Namen aus void newscore( int pkt); // ein neuer Highscore wurde erzielt ~highscore(); // Destruktor };

Konstruktor highscore::highscore() { int i; FILE *pf; for( i = 0; i < 5; i++) { high[i].punkte = 0; *(high[i].name) = 0; } pf = fopen( "ul_high.dat", "r"); if( !pf) return; for( i = 0; i < 5; i++) { fscanf( pf, "%d,", &high[i].punkte); fgets( high[i].name, 40, pf); high[i].name[ strlen(high[i].name)-1] = 0; } fclose( pf); }

Destruktor highscore::~highscore() { int i; FILE *pf; pf = fopen( "ul_high.dat", "w"); for( i = 0; i < 5; i++) fprintf( pf, "%d,%s\n", high[i].punkte, high[i].name); fclose( pf); }

Anzeige der Highscores Im Zuge der Initialisierung werden die Daten aus der Tabelle ausgelesen und in den Feldern des Dialogs angezeigt

BOOL CALLBACK highscoredialog( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: SetDlgItemInt( hwndDlg, IDC_SCORE1, ultris_highscores.get_score(0), FALSE); SetDlgItemInt( hwndDlg, IDC_SCORE2, ultris_highscores.get_score(1), FALSE); SetDlgItemInt( hwndDlg, IDC_SCORE3, ultris_highscores.get_score(2), FALSE); […] SetDlgItemText( hwndDlg, IDC_NAME1, ultris_highscores.get_name(0)); SetDlgItemText( hwndDlg, IDC_NAME2, ultris_highscores.get_name(1)); SetDlgItemText( hwndDlg, IDC_NAME3, ultris_highscores.get_name(2)); […] return TRUE; case WM_COMMAND: if((wParam == IDOK)||(wParam == IDCANCEL)) EndDialog(hwndDlg, wParam); break; } return FALSE; }

Wird der Menüpunkt ID_INFO_HIGHSCORES ausgewählt, brauchen wir die Funktion DialogBox, um den Dialog aufzurufen LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { […] case ID_INFO_HIGHSCORES: DialogBox( ultris_instance, MAKEINTRESOURCE(IDD_HIGHSCORE), ultris_window, highscoredialog); mein_spiel.reset_timer(); return 0; […] }

Zum Abschluss müssen wir dafür sorgen, dass der Spieler, wenn er einen neuen Highscore erreicht hat, seinen Namen einträgt und dieser dann in die Highscore-Liste eingetragen wird. Hierzu brauchen wir zunächst einen Dialog Siegerehrung Dabei ist es egal, was als Siegertext angegeben wird, dieser wird später (in der Funktion newscore) überschrieben (um Platz und Punkte einzufügen)

In der Funktion onestep wird erkannt, wann das Spiel beendet ist. Ist dies der Fall, wird die Funktion newscore der Klasse highscore mit der aktuellen Punktzahl aufgerufen. ( ultris_highscore.newscore(punktestand); ) Dort werden verschiedene Sachen erledigt: 1. Es wird geprüft, ob die Punktzahl höher ist als eine andere in der Highscore- Tabelle 2. Alle Highscores, die unter der neuen Punktzahl liegen, rücken eine Position in der Tabelle nach hinten 3. Die neue Punktzahl wird eingetragen (der Name noch nicht) 4. Eine Siegesfanfare wird abgespielt 5. Der Variablen buf wird nun der Text für die Siegerehrung zugewiesen (mit Punktzahl und Position) 6. Der Dialog Siegerehrung wird mit dieser Variablen als Parameter aufgerufen 7. Der in diesem Dialog eingegebene Name wird auch in der Variablen buf gespeichert, dieser dann in die Highscore-Tabelle eingetragen 8. Zum Abschluss wird die Highscore-Tabelle nochmal angezeigt Als Code sieht das Ganze dann folgendermaßen aus:

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung,(LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); }

void highscore::newscore( int pkt) { int pos, i; char buf[256]; for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--) ; if( pos < 5) { for( i = 4; i > pos; i--) high[i] = high[i-1]; high[pos].punkte = pkt; *(high[i].name) = 0; ultris_sounds.play( sound_win); sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1); DialogBoxParam(ultris_instance,MAKEINTRESOURCE(IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); buf[38] = 0; strcpy( high[pos].name, buf); PostMessage( ultris_window,WM_COMMAND,ID_INFO_HIGHSCORES, 0); }

Letzter Schritt: Um zu erreichen, dass der Dialog Siegerehrung auch wieder einen Parameter (buf) nach Beendigung übergibt, müssen wir den Code für den Dialog-Aufruf noch entsprechend modifizieren: BOOL CALLBACK siegerehrung( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static char *parameter; switch (uMsg) { case WM_INITDIALOG: parameter = (char *)lParam; SetDlgItemText( hwndDlg, IDC_SIEGERTEXT, parameter); return TRUE; case WM_COMMAND: if(wParam == IDOK) { GetDlgItemText( hwndDlg, IDC_NAME, parameter, 256); EndDialog(hwndDlg, wParam); } break; } return FALSE; }

Das wäre dann auch alles. Noch Fragen?