V03 Laden und Speichern von Spielfeldern und der Spielfeldeditor.

Slides:



Advertisements
Ähnliche Präsentationen
Strukturen in C Spelz, Sievers, Bethke.
Advertisements

Klassen - Verkettete Liste -
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
VO2 Laden und Initialisieren der Sounds. Wir wollen Sounds in unsere Applikation laden Menü erweitern –um den Menüpunkt Sound –mit dem Identifier ID_ULTRIS_SOUND.
Ultris Version 8: Erzeugen der Formen und Anzeigen der Vorschau
Ultris V10 Bewegen, Drehen und Kollisionserkennung.
V11 Auflösen der Formen und Abräumen der Reihen. Zwei neue Methoden ___________________________________ class ultris { private: … void aufloesen(); void.
Ein Beispiel in Java.
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
V10 - Kollisionen Nicolas Matentzoglu. Inhalt der Präsentation Kollisionserkennung bei Hindernissen Verhalten der Kugel über verschiedenen Untergründen.
V10: Bewegen der Formen und Kollisionserkennung Steuerung der Spielsteine durch Tastenbefehle (Übersicht der Befehle unter der Hilfe)
V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++
Softwaretechnologie II WS 08/09 SpieleProgrammieren UlTris V07 Reihen vorbelegen, Spielfeld anzeigen und Punktestand ausrechnen Sibylle C. Schellhorn,
Tag 2 Look-up-Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung Quelle: 3D-Spiele mit C++ und DirectX in 21 Tagen, Alexander.
V12 Highscores WS 2009/10 Simulation und 3D Programmierung Prof. Dr. Manfred Thaller Martina Hänsel.
Vers. 6: Der Konfigurationsdialog Quelle: Spieleprogrammierung mit DirectX und C++, U. Kaiser und P. Lensing, Galileo Computing (2007)
Spieleprogrammierung mit DirectX und C++
V11 Auflösen der Formen Abräumen der Reihen. Erweiterung der Klasse ultris class ultris { private: … void aufloesen() void aufruecken() public: … }
Windows Explorer.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Typo3für RFB Anmeldung.
Einführung in Visual C++
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.
Einfach verkettete Listen (OOP)
Tipps und Tricks für Word 2000 Aytac, Felix, Steffen 04/05.
Objektorientierte Modellierung
Java programmieren mit JavaKara
Wie erstelle ich einen Spielplan von unserer Homepage? Der Schlüssel liegt hinter dem Button Spiele, Ergebnisse Hier alle Spiele wählen. Hier das gewünschte.
Textgestaltung mit Word
Delphi II - OOP IFB Fortbildung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Java und Eclipse.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
11. Tabellen 11.1 Grundlegende Tabellenbearbeitung
Gruppe: Gewinnt Überblick 1.0 (Martin Kapfhammer)
16. Mit dem Explorer im WWW arbeiten l Wenn die Adresse bekannt ist l Ins Feld Adresse klicken l URL eingeben (RETURN¢) oder l Wenn nach einer Adresse.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Öffnen und Laden Aktenordner Symbol in der Symbolleiste oder in der Menüleiste unter [Datei] [Öffnen] anklicken Laufwerk und Verzeichnis auswählen, auf.
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
die Auftragsbearbeitung für den Kleinbetrieb
PHP Basic.
Aufruf einer Methode eines Objektes vom Typ „Bruch“
EPROG Tutorium #3 Philipp Effenberger
Menüeinträge erstellen Hier wird erklärt, wie man einen weiteren Menüpunkt einfügt am Beispiel: Menüeintrag, der mit Beiträgen gefüllt werden soll.
Starten der Entwicklungsumgebung (IDE)
ICT – Modul Textverarbeitung
Erste Schritte in DELPHI
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
Der Windows-Desktop Beispiel für den Windows-Desktop.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
1 Erstellung eines Lebenslaufes
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Arbeiten mit WordSmith 4. Inhalt 1. Arbeiten mit der Funktion Wortliste (im getaggten Korpus) 1. Arbeiten mit der Funktion Wortliste (im getaggten Korpus)
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Allgemeine Technologien 2
Felder in Java.
«Delegierter» Methoden Schablone Funktionszeiger
 Präsentation transkript:

V03 Laden und Speichern von Spielfeldern und der Spielfeldeditor

Die Spielfeld-Datei: Format 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

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

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

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(); )

Die Gestaltung des Spielfeld-Editors Erstellung eines Dialogs mit dem Ressourcen- Editor (zeigen) Erweiterung der Klasse spielfeld.

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

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

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.

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. } ?

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)

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;

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;

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;