Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Vane Junior JLI'ler
Anmeldedatum: 03.11.2005 Beiträge: 70
Medaillen: Keine
|
Verfasst am: 03.04.2006, 16:18 Titel: Maps verwalten |
|
|
Das Thema ist schon in meinem vorherigen Topic erwähnt worden, bloß es passte nicht alzu sehr zum thema also mache ich mal ein neues auf...
Also ich benutzte tiles um eine map zu erstellen, klapt auch alles. Die initialisierung der map erfolgt in meiner spieleschleife, da wurde mir gesagt das ist unefizient, ich sollte das außerhalb initialisieren.
Also habe ich das nach außen gepackt bloß ich brauche drei oder vier maps, wie initialisiere ich die sofort am anfang ohne das die vorherige map verloren geht, so das ich während meines Spiel zwischen den maps echseln kann?
Irgendwie müßte ich doch die maps am anfang initialisieren können und sie zwischenspeichern um so auf jede einzeln zugreifen zu können, wie könnte ich das machen? |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 03.04.2006, 16:30 Titel: |
|
|
Hallo
Du könntest alle Tiles in einen vector packen und dann die vectoren in einen Array oder je nach dem in einen weiteren Vector packen. Dann kannst du während des spiels immer auf alle zugreifen.
Aber ich denke du kannst die maps schon in der Spielschleife initialisieren nur nicht jedes mal wenn sie durchläuft also etwa so:
CPP: | while(prog nicht beendet)
{
if(map ist nicht initialisiert)
{
Initialisieremap()
map_initialisiert = true;
}
}
| [/code] _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 03.04.2006, 16:38 Titel: |
|
|
oder du machst das So:
CPP: | // 4 Maps erstellen
Map maps[4] = {"start.map", "hölle.map", "stand.map", "summer.map"};
int cur_map = 0;
// Spielschleife
while(programm noch am laufen)
{
// Map aktualisieren
maps[cur_map].update();
// und rendern
maps[cur_map].render();
}
|
du kannst das natürlich auch mit zeigen machen _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Vane Junior JLI'ler
Anmeldedatum: 03.11.2005 Beiträge: 70
Medaillen: Keine
|
Verfasst am: 03.04.2006, 16:52 Titel: |
|
|
51m0n hat Folgendes geschrieben: | Hallo
Du könntest alle Tiles in einen vector packen und dann die vectoren in einen Array oder je nach dem in einen weiteren Vector packen. Dann kannst du während des spiels immer auf alle zugreifen.
Aber ich denke du kannst die maps schon in der Spielschleife initialisieren nur nicht jedes mal wenn sie durchläuft also etwa so:
CPP: | while(prog nicht beendet)
{
if(map ist nicht initialisiert)
{
Initialisieremap()
map_initialisiert = true;
}
}
| [/code] |
Deine idee gefällt mir gut, die mit der Spieleschleife werde sie auch verwenden, zur zweiten antwort, ja so habe ich mir das vorgestellt, bloß ich müßte vom DirectX code her die maps vorher initialisieren und irgendwo zwischen speichern und damit komme ich nicht klar, das geht ja schon in richtung level editor, bloß ich weiß auch nicht wie man so ein 2D Leveleditor programmiert, das ist mein Hauptproblem...
Ist das den überhauptmöglich die maps irgendwie alle sofort zu initialisieren und irgendwo zwischen zu speichern und sie von dort aufzurufen, kenne mich nämlich in DirectX noch nicht so gut aus... |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 03.04.2006, 17:12 Titel: |
|
|
Nun ja du kannst eine Datei erstellen wo alle Tiles und ihre positionen drinstehen. Diese list du dann ein und Speicherst sie in einem Vector oder Array. Dann zeichnest du die Tiles anhand ihrer Koordinaten die du auch gespeichert hast. Hier ist mal ein kleiner Beispiel Code so wie ich das meine:
CPP: | struct Map
{
std::vector<Tile> Tiles;
};
struct Tile
{
std::string name;
int x;
int y;
};
void ZeichneMap(Map map)
{
for(int i = 0; i < map.Tiles.size(); i++)
{
DrawTile(map.Tiles[i].name, map.Tiles[i].x, map.Tiles[i].y);
}
}
Map LadeMap(std::string mapname)
{
Map map;
lesealledaten aus mapname speichere diese in map();
return map;
}
int main()
{
Map CurrentMap;
while(pro nicht beendet)
{
if(map is noch nicht initialisiert)
{
CurrentMap = LadeMap("erstemap.map");
}
else
{
ZeichnerMap(CurrentMap)
}
}
return 0;
}
|
So ist jetzt nur ne kleine Anregung und hat noch viele verbesserungsmöglichkeiten. zB. Nur Die Tiles zeichnen die sich auch sichbar sind. Aber so kannst du immer mit der Funktion LadeMap() eine bestimmte map laden wenn du willst. _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Vane Junior JLI'ler
Anmeldedatum: 03.11.2005 Beiträge: 70
Medaillen: Keine
|
Verfasst am: 03.04.2006, 17:39 Titel: |
|
|
51m0n hat Folgendes geschrieben: | Nun ja du kannst eine Datei erstellen wo alle Tiles und ihre positionen drinstehen. Diese list du dann ein und Speicherst sie in einem Vector oder Array. Dann zeichnest du die Tiles anhand ihrer Koordinaten die du auch gespeichert hast. Hier ist mal ein kleiner Beispiel Code so wie ich das meine:
CPP: | struct Map
{
std::vector<Tile> Tiles;
};
struct Tile
{
std::string name;
int x;
int y;
};
void ZeichneMap(Map map)
{
for(int i = 0; i < map.Tiles.size(); i++)
{
DrawTile(map.Tiles[i].name, map.Tiles[i].x, map.Tiles[i].y);
}
}
Map LadeMap(std::string mapname)
{
Map map;
lesealledaten aus mapname speichere diese in map();
return map;
}
int main()
{
Map CurrentMap;
while(pro nicht beendet)
{
if(map is noch nicht initialisiert)
{
CurrentMap = LadeMap("erstemap.map");
}
else
{
ZeichnerMap(CurrentMap)
}
}
return 0;
}
|
So ist jetzt nur ne kleine Anregung und hat noch viele verbesserungsmöglichkeiten. zB. Nur Die Tiles zeichnen die sich auch sichbar sind. Aber so kannst du immer mit der Funktion LadeMap() eine bestimmte map laden wenn du willst. |
Also habe alles soweit verstanden, bloß deinen anfang verstehe ich nicht so ganz....
"Nun ja du kannst eine Datei erstellen wo alle Tiles und ihre positionen drinstehen."
Wie meinst du das? ich besitzte bereits eine funktion die ein zweidimensionales array wo angegeben wird welches tile an welche position hingehört zeichnet.
Meinst du das? |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 03.04.2006, 17:47 Titel: |
|
|
Das war mehr auf den Leveleditor bezogen. Du schreibst ein Programm was den namen und die position (und vieleicht noch andere wichtige daten) in eine Datei schreibst und diese dann in deinem game ausliest.
Hat dir denn mein kleines Codebeispiel was genützt? _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Vane Junior JLI'ler
Anmeldedatum: 03.11.2005 Beiträge: 70
Medaillen: Keine
|
Verfasst am: 03.04.2006, 17:55 Titel: |
|
|
Ja ist dir richtig gelungen, müsste eigentlich so klappen....
Danke ist richtig gut geworden.
Was ich noch wissen wollte dein Code Beispie bezieht sich aber nicht auf den Leveleditor, oder? |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 03.04.2006, 18:00 Titel: |
|
|
Ne das CodeBeispiel bezieht sich auf das game.
Die Methoden LadeMap() und ZeichneMap() kann man in abgewandelter Form auch bei dem Editor benutzen. _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 03.04.2006, 20:57 Titel: |
|
|
Was auch noch möglich wäre: Du brauchst gar nicht in der Hauptschleife abzufragen, ob die Map initialisiert ist. Du kannst genauso gut z.B. eine bestimmte Taste mit diesem Ereignis belegen oder das anderwertig tiefer ins Programm einbauen. Der positive Effekt dabei ist, dass deine Hauptschleife nicht durch sinnloses Abfragen belastet wird, wenn es vielleicht gar nicht nötig wäre. Klingt zwar vielleicht pedantisch, aber so kannst du schon mal eine if-Anweisung sparen.
Ich nehme an, damit deine Spielwelt eine Grenze hat, musst du sowieso abfragen, ob der Spieler direkt am Rand einer Map steht oder nicht. Wenn er dort steht (und das wird statistisch gesehen sehr selten der Fall sein) - nur dann - würde ich abfragen, ob er die nächste Map laden soll.
Steht der Spieler nun in der Mitte der Map und es steht sowieso kein Mapwechsel in Aussicht, wird gar nicht erst die Map abgefragt
/verschoben nach Entwicklung - mit DirectX hat das ja wenig zu tun _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 09.04.2006, 16:03 Titel: |
|
|
Ich denke nicht dass du bei jedem Bild eine andere Map brauchst? Eher in jeder Runde. Dann nimm einen Vektor und klopp ihn leer und lad ihn neu mit was anderem beim Mapwechsel.
Sonst brauchst du ja ewig viel Speicher, oder? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
|