V12 Highscores
-
Upload
arnoldo-cobelo -
Category
Documents
-
view
19 -
download
0
description
Transcript of V12 Highscores
V12 Highscores
Nicolas matentzoglu
Spieleprogrammierung mit DirectX und C++
• class highscore
• {
• struct score // mit dieser Struktur
• {
• int punkte; // kann eine Zahl und eine
• char name[40]; // Zeichenkette (Name) gespeichert werden.
• };
• private:
• score high[5]; // ein Array, in das 5 dieser Strukturen passen
• public:
• Highscore(); //Konstruktor
• int get_score( int i){ return high[i].punkte;} //Funktion die Punkte zurückgibt
• const char *get_name( int i){ return high[i].name;} //name zurück
• void newscore( int pkt); //Funktion, um einen neuen Highscore einzutragen
• ~highscore(); };
high.dat:------------------------------------------------------------827393,Daniel E723908,Florian T671627, Tobias G587888, Lisa R468787, Hye Lim C
•highscore::highscore()•{•int i;•FILE *pf; //stream Objekt
•for( i = 0; i < 5; i++) //alle Positionen im array zurücksetzen•{•high[i].punkte = 0;•*(high[i].name) = 0;•}•pf = fopen( "ul_high.dat", "r"); // Datei im read-mode öffnen•if( !pf) //hat es geklappt?•return;
•for( i = 0; i < 5; i++) •{•fscanf( pf, "%d,", &high[i].punkte); //eine Zeile einlesen, (das integer) und in die
//struct kopieren•fgets( high[i].name, 40, pf); //den Rest der Verbleibenden Zeile in name kopieren•high[i].name[ strlen(high[i].name)-1] = 0; // nach dem Name im Array ein
// Zeichenketten-Ende setzen.•}•fclose( pf); //stream schließen.•}
highscore::~highscore(){int i;FILE *pf;
pf = fopen( "ul_high.dat", "w");for( i = 0; i < 5; i++) //hier wird der Inhalt der struct in die
// ul_high.dat geschrieben.fprintf( pf, "%d,%s\n", high[i].punkte, high[i].name);fclose( pf);}
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); //..... und die anderen scoresSetDlgItemText( hwndDlg, IDC_NAME1, ultris_highscores.get_name(0));SetDlgItemText( hwndDlg, IDC_NAME2, ultris_highscores.get_name(1)); //.. und die anderen Namenreturn TRUE;
case WM_COMMAND:if((wParam == IDOK)||(wParam == IDCANCEL))EndDialog(hwndDlg, wParam);break;}return FALSE;}
case ID_INFO_HIGHSCORES:DialogBox( ultris_instance, MAKEINTRESOURCE( IDD_HIGHSCORE), ultris_window, highscoredialog);mein_spiel.reset_timer(); //spielzeit wird zurückgesetztreturn 0;
In ultris_windowhandler
In onestep();
ultris_highscores.newscore( punktestand);// der aktuelle Punktestand wird nach Beendigung des Spiels der //Funktion newscore(); zur Verarbeitung übergeben.
void highscore::newscore( int pkt){int pos, i;char buf[256];
for( pos = 5; pos && (high[pos-1].punkte < pkt); pos--); //solange der aktuelle Punktestand größer ist als jeweilige Wert im Array die Position // abchecken.if( pos < 5) //in den Highscores?{for( i = 4; i > pos; i—) high[i] = high[i-1]; // alle Postionen unter dem aktuellen Highscore um eins runterhigh[pos].punkte = pkt;*(high[i].name) = 0; //name wird zunächst zurückgesetzt. Später gefüllt.ultris_sounds.play( sound_win);sprintf( buf, "Glückwunsch, du hast mit %d Punkten den %d. Platz erreicht!", pkt, pos+1);// in buf (dem Puffer) wird der Ausgabetext für die Siegerehrung (neues Dialogfeld) kopiert.DialogBoxParam( ultris_instance, MAKEINTRESOURCE( IDD_SIEGEREHRUNG), ultris_window, siegerehrung, (LPARAM)buf); //und hier wird buf übergeben.Buf[38] = 0; // im Dialogfenster wird buf dann mit dem Namen gefüllt, und zurück//gegeben. Danach auf 38 zeichen gekürzt.strcpy( high[pos].name, buf);// hier dann in unsere struct kopiertPostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0);} // Anzeigen des Highscore-Dialogs}
BOOL CALLBACK siegerehrung( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{static char *parameter;
switch (uMsg){case WM_INITDIALOG: // wenn das Fenster initialisiert wird, wird
der Dialogtext des Items mit dem Paramter aktualisiert ankgeziegt.parameter = (char *)lParam; //puffer von newscoreSetDlgItemText( hwndDlg, IDC_SIEGERTEXT, parameter);//parameter wird dann hier in dem Textfeld angezeigtreturn TRUE;
case WM_COMMAND:if(wParam == IDOK)
{GetDlgItemText( hwndDlg, IDC_NAME, parameter, 256); //name in den ZeichenpufferEndDialog(hwndDlg, wParam); //und zurück...}
break;}
return FALSE;}