Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die."—  Präsentation transkript:

1 3D Programmierung Version 12 - Highscores

2 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

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

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

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

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

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

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

9 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; […] }

10 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)

11 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:

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

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

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

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

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

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

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

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

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

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

22 Das wäre dann auch alles. Noch Fragen?


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

Ähnliche Präsentationen


Google-Anzeigen