90 likes | 212 Views
Nicolas matentzoglu. V12 Highscores. 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 :
E N D
Nicolas matentzoglu V12 Highscores 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 • constchar *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 E • 723908,Florian T • 671627, Tobias G • 587888, Lisa R • 468787, 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 scores SetDlgItemText( hwndDlg, IDC_NAME1, ultris_highscores.get_name(0)); SetDlgItemText( hwndDlg, IDC_NAME2, ultris_highscores.get_name(1)); //.. und die anderen Namen return TRUE; case WM_COMMAND: if((wParam == IDOK)||(wParam == IDCANCEL)) EndDialog(hwndDlg, wParam); break; } return FALSE; }
In ultris_windowhandler case ID_INFO_HIGHSCORES: DialogBox( ultris_instance, MAKEINTRESOURCE( IDD_HIGHSCORE), ultris_window, highscoredialog); mein_spiel.reset_timer(); //spielzeit wird zurückgesetzt return 0; 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 runter high[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 kopiert PostMessage( ultris_window, WM_COMMAND, ID_INFO_HIGHSCORES, 0); } // Anzeigen des Highscore-Dialogs }
BOOL CALLBACK siegerehrung( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { staticchar *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 newscore SetDlgItemText( hwndDlg, IDC_SIEGERTEXT, parameter); //parameter wird dann hier in dem Textfeld angezeigt return TRUE; case WM_COMMAND: if(wParam == IDOK) { GetDlgItemText( hwndDlg, IDC_NAME, parameter, 256); //name in den Zeichenpuffer EndDialog(hwndDlg, wParam); //und zurück... } break; } return FALSE; }