1 / 22

3D Programmierung

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.

fathia
Télécharger la présentation

3D Programmierung

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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: 567890,Phil Marlowe 456789,Sam Spade 345678,Lew Archer 234567,Inspector Columbo 123456,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?

More Related