Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Hrodric Schmechel Geändert vor über 10 Jahren
1
V03 Laden und Speichern von Spielfeldern und der Spielfeldeditor
2
Die Spielfeld-Datei: Format 88 00 04102312 01210310 00123344 12313423 12123122 23132132 12133213 12312220 04102312 01210310 00100344 10003423 12123122 23130032 12000013 12002220 Zeilen + Spalten Startzeile + Startspalte Felder 0=Wasser 1=Holz 2=Stein 3=Gras 4=Ziel Hindernisse 0= Kein Hindernis 1= Kegel 2= Bumper 3= Markierung Zeile 2 Zeile 1 Zeile 0
3
Laden einer Spielfeld-Datei class spielfeld { private: char filename[256]; public:... void laden(); // in dieser Funktion wird das Spielfeld aus einer Datei ausgelesen. void speichern(); // analog. }; void spielfeld::laden() { FILE *pf; int z, s; OPENFILENAME ofn = { sizeof(OPENFILENAME), balance_window, NULL, "Text-Dateien (.txt)\0*.txt\0\0", NULL, 0, 1, filename, 256, NULL, 0, NULL, "Spielfeld laden", OFN_FILEMUSTEXIST, 0, 1, NULL, 0, NULL, NULL }; //..........weiter nächste Seite
4
if(GetOpenFileName( &ofn)) //hier wird gecheckt, ob ein Name gewählt wurde { pf = fopen( filename, "r"); //hier wie gehabt geöffnet anzahl_markierungen = 0; fscanf( pf, "%d %d", &zeilen, &spalten); // hier werden die 4 Zahlen am Anfang // unserer Datei ausgelesen und in die Variablen unserer Klasse geschrieben fscanf( pf, "%d %d", &startz, &starts); for( z = zeilen-1; z >= 0; z--) //die Zeilen werden von unten an durchgegangen {// wegen der Spezifikation. for( s = 0; s < spalten; s++) // innerhalb der Zeile spaltenweise fscanf( pf, "%d", &felder[z][s]); } for( z = zeilen-1; z >= 0; z--) // das selbe passiert mit den Hindernissen { for( s = 0; s < spalten; s++) { fscanf( pf, "%d", &save_hind[z][s]); save_hind[z][s]--; if( save_hind[z][s] == MARKIERUNG) // Zählung der Markierungen. // Wird später wichtig. anzahl_markierungen++; } fclose( pf); }
5
Speichern des Spielfelds Absolut analog zum laden. Die einzelnen Felder werden aus den arrays für Spielfeld und Hindernisse ausgelesen und in die Datei geschrieben. Eintragen als Menüpunkte und Integration in den CALLBACK-Handler. ID_SPIEL_LADEN (Im Callback-Handler: Aufruf von laden(); start(); und render(); ) ID_SPIEL_SPEICHERN (Im Callback-Handler: Aufruf von speichern(); )
6
Die Gestaltung des Spielfeld-Editors Erstellung eines Dialogs mit dem Ressourcen- Editor (zeigen) Erweiterung der Klasse spielfeld.
7
class spielfeld { private:.... int edit; // flag, das zeigt ob der Editor aktiv ist oder nicht int ezeile; // das aktuell im Editor gewählte feld int espalte; // public:... char filename[256]; void laden(); void speichern(); void editor_on() {edit = 1; ezeile = 0; espalte = 0;} // hier wird der Editor eingeschaltet void editor_off() {edit = 0;} // hier aus int editiermodus() {return edit;} // ist der Editor an? int editzeile() { return ezeile;} // In welcher Zeile ist das zu editierende Feld int editspalte() { return espalte;} // in welcher Spalte?? void espalte_plus() { espalte = (espalte +1) % spalten;} // Navigation im Editor void espalte_minus() { espalte = (espalte + spalten -1) % spalten;} void ezeile_plus() { ezeile = (ezeile +1) % zeilen;} void ezeile_minus() { ezeile = (ezeile + zeilen -1) % zeilen;} void edit_feld( int f, int h); // hier wird der Inhalt eines Felder später gesetzt void edit_start(); //Das aktuelle gewählte Feld wird zum Startfeld };
8
void spielfeld::edit_feld(int u, int h); if(((ezeile == startz) && (espalte == starts))||(u == WASSER) || (u == ZIEL)) h = -1; // wenn wir das Startfeld, das Zielfeld oder ein Wasserfeld gewählt haben, soll es nicht // möglich sein, dort ein Hindernis zu setzen if((ezeile == startz) && (espalte == starts) && ((u == WASSER) || (u == ZIEL))) return; // auf dem Startfeld darf kein Wasser sein und nicht das Zielfeld. felder[ezeile][espalte] = u; //hier wird der Untergrund eingetragen hind[ezeile][espalte] = h; //hier das Hindernis
9
void spielfeld::edit_start() if( (felder[ezeile][espalte] == WASSER) || (felder[ezeile][espalte] == ZIEL)) // wenn im aktuellen feld Wasser ist oder das Ziel felder[ezeile][espalte] = HOLZ; // Wandle es in einem Holzuntergrund hind[ezeile][espalte] = NICHTS; // und lösche das Hindernis startz = ezeile; // dann markier das Feld als das Startfeld starts = espalte; Hinweis: Beim Start des Programms sollen wir uns NICHT im Editor-Modus befinden. Daher wird im Spielfeld-Konstruktor die Funktion editor_off() aufgerufen, um das entsprechende Flag zu setzen.
10
Der Rahmen um die Felder: Änderungen an der render() - Funktion if( mein_spielfeld.editiermodus()) // wenn wir im Editor-Modus sind { D3DXMatrixTranslation( &world, mein_spielfeld.verschiebung_x(mein_spielfeld.editspalte()), // 0.0f, mein_spielfeld.verschiebung_z(mein_spielfeld.editzeile()) ); mein_directx.device->SetTransform( D3DTS_WORLD, &world); meine_objekte.rahmen.draw(); // hier wird der Rahmen gezeichnet. } ?
11
void init_editdialog( HWND dlg) SetDlgItemInt( dlg, IDC_ZEILENZAHL, mein_spielfeld.zeilen, FALSE); // hier wird das Feld names IDC_ZEILENZAHL mit der aktuellen anzahl an Zeilen gefüllt SetDlgItemInt( dlg, IDC_SPALTENZAHL, mein_spielfeld.spalten, FALSE); SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_ADDSTRING, 0, (LPARAM)"Wasser"); // Hier wird der String Wasser als Option in die Auswahlliste hinzugefügt. (CB_==combobox) SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_ADDSTRING, 0, (LPARAM)"Holz"); SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_ADDSTRING, 0, (LPARAM)"Stein"); SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_ADDSTRING, 0, (LPARAM)"Gras"); SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_ADDSTRING, 0, (LPARAM)"Ziel"); SendDlgItemMessage(dlg, IDC_HINDERNIS, CB_ADDSTRING, 0, (LPARAM)"(kein)"); SendDlgItemMessage(dlg, IDC_HINDERNIS, CB_ADDSTRING, 0, (LPARAM)"Kegel"); SendDlgItemMessage(dlg, IDC_HINDERNIS, CB_ADDSTRING, 0, (LPARAM)"Bumper"); SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_SETCURSEL, 0, 0); SendDlgItemMessage(dlg, IDC_HINDERNIS, CB_SETCURSEL, 0, 0); // CB_SETCURSEL wählt einen string in einer Combobox aus.. (Anfangswerte, Auswahl)
12
Der Callback-Handler des Dialogs switch( wParam) { case IDC_SPALTE_PLUS: // die nächsten 4 cases wählen immer ein neues // Feld aus, das jetzt bearbeitet wird mein_spielfeld.espalte_plus(); mein_spiel.render(); break; case IDC_SPALTE_MINUS: mein_spielfeld.espalte_minus(); mein_spiel.render(); break; case IDC_ZEILE_PLUS: mein_spielfeld.ezeile_plus(); mein_spiel.render(); break; case IDC_ZEILE_MINUS: mein_spielfeld.ezeile_minus(); mein_spiel.render(); break;
13
case IDC_FELD_SETZEN: v = SendDlgItemMessage(dlg, IDC_UNTERGRUND, CB_GETCURSEL, 0, 0); // der in der Combobox gewählte Untergrund wird in v gespeichert. w = SendDlgItemMessage(dlg, IDC_HINDERNIS, CB_GETCURSEL, 0, 0) – 1; // ebenso das Hindernis in w mein_spielfeld.edit_feld( v, w); // im Spielfeld gesetzt mein_spiel.render(); // und angezeigt break; case IDC_STARTFELD_SETZEN: mein_spielfeld.edit_start(); // wenn der Button ausgelöst wird, wird an der enstsprechenden Stelle der // Startpunkt gesetzt mein_spiel.render(); // dann neu gerendert break; case IDC_GROESSE_SETZEN: v = GetDlgItemInt( dlg, IDC_ZEILENZAHL, NULL, FALSE); // die Zahl der Zeilen in v w = GetDlgItemInt( dlg, IDC_SPALTENZAHL, NULL, FALSE); // die Zahl der Spalten in W mein_spielfeld.init( v, w, 0); //Das Spielfeld wird neu initialisiert mein_spiel.start(); mein_spiel.render(); // und angezeigt break; case IDCANCEL: mein_spielfeld.editor_off(); // Editor-Modus wird verlassen EndDialog(dlg, wParam); break; } break; } return FALSE;
14
Callback-Handler Balance case ID_EINSTELLUNGEN_SPIELFELD: mein_spiel.start(); DialogBox( balance_instance, MAKEINTRESOURCE( IDD_SPIELFELDEDITOR), balance_window, spielfeldeditor); // aufruf des Dialogs bei Klick mein_spielfeld.save(); break;
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.