Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.06.2014, 19:39

Wie funktioniert ein Tilemap Editor ?

Guten Abend,
Ich habe mir schon seit längerem Gedanken darüber gemacht einen eigenden Tilemap Editor in C++ und SFML zu programmieren.
Das mit der GUI und so verstehe ich ja noch, doch was ich nicht verstehe ist, wenn der Benutzer jetzt beispielsweise eine Map erstellen möchte dann soll er ja auch angeben können wie groß sie ist.
Und dort liegt auch schon das Problem ich habe keinerlei Ahnung wie ich das umsetzen könnte. Ich hatte schon die Idee ein Sprite zu laden das dann so ein Kachel Feld enthält und dann hätte ich einfach nur noch
Rect's über das Sprite gezogen und geprüft ob die Maus darüber ist. Das Problem an dieser Geschichte ist halt nur das man dann ja immer eine gleich große Map hat.

Meine zweite Idee war es ein Vertex-Array zu benutzen und mit hilfe von quadst ein dynamisches Array zu erzeugen. Diese Idee würde wiederum klappen glaube ich, nur ist halt dort das Problem das dass Array dann
ganz schön groß werden kann und ich auch dort leider dann keine Ahnung habe wie ich anhand der Größe der angegebenden Werte die Position der Quads bestimme.

Ich hoffe ihr könntet mich dort ein wenig aufklären.

MFG
Sceiwen

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

2

27.06.2014, 23:08

Das ist eigentlich gar nicht so schwer.
Zuerst brauchst du eine Datei, in der du die Werte deiner Tiles speicherst. Z.B: Steht an erster Position (1,2), so werden diese Informationen in einen 2 Dimensionalen Array gespeichert.
Diese Datei muss eingelesen werden und die entsprechenden Tiles gerendert.

Ein Editor würde das ganze umgekehrt machen. Er nimmt Input des Benutzers an (Mausklick zum platzieren eines Tiles (falls der Mauszeiger sich innerhalb von (0,0,16,16) befindet -> erstes Tile gewählt)) und schreibt die richtigen Informationen in die Datei.

Ich hab selbst schon viel mit Tile Maps gearbeitet und hab auch eine Klasse dafür in der SFML geschrieben.
Falls du willst kannst du mir mal eine PN schicken und ich erläutere dir alles genau.

MfG,
Cranberry

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cranberry« (27.06.2014, 23:30)


m3xx

Alter Hase

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

3

28.06.2014, 01:31

Sein Problem bezieht sich nicht auf den Aufbau, sondern auf die Größe der Map. Klar sollte sein, dass je größer die map umso mehr Speicher benötigt sie auch. Ich hätte jetzt auch dynamisch ein 2 dimensionales Array erstellt, frisst halt nur Speicher. Leider kann ich dir da nicht so wirklich helfen, sonst hätte ich schon geholfen :/

4

28.06.2014, 01:43

Du kannst auch ein eindimensionales array oder vector verwenden, das Höhe*Breite groß ist und somit alle Tiles auf einmal fasst. Um den Index zu einem Tile darin zu bekomme, rechne einfach index = y*mapbreite+x.
Die größe wäre nucht unbedingt das Problem, wenn du jedes Tile mit 4 byte beschreibst, und deine Map 256x256 Tiles groß ist, wären das Insgesamt 256 KiB. Das sollte also verkraftbar sein ;)

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

5

28.06.2014, 02:00

Nur ein Gedanke. Ist es wirklich wichtig wie groß der Benutzer sein Spielfeld haben möchte? Ist es nicht eigentlich nur wichtig wie groß die maximal Größe eines Spielfeldes sein kann (Also der Datentyp der deine Koordinaten hält)? Ich hab mit so etwas ansich keine Erfahrung. Jedoch wäre mein Ansatz unwichtige Daten nicht zu halten (In diesem Fall die Felder der Karte die der Benutzer garnicht gefüllt hat).

Der Editor würde nur ein “virtuelles” Raster zeigen und keinen Ausschnitt einer realen Datenstruktur (z.B. 2D Array). Über den ausgewählten Ausschnitt würde ich einem Lookup auf eine z.B. Tabelle (oder effektivere Datenstruktur) machen und schauen ob sich dort etwas befindet, wenn ja wird dies gezeichnet.

Oder der Benutzer kann über den Lookup der Tabelle etwas hinzu fügen. Speichern würde ich dann auch nur diese Tabelle und evtl. welcher Art alle in der Tabelle nicht vorhandenen Felder haben (Wiese, Mauer… Berge oder was auch immer).
:love: := Go;

6

28.06.2014, 10:23

Du kanst natürlich auch alle Tiles in einer Liste speichern und die Koordinaten mitspeichern. Wenn du dann zeichnest, gehst du die Liste durch und zeichnest was an der angegebenen Stelle.

7

28.06.2014, 12:10

Ich weiß jetzt nicht, ob das ist, was du suchst, aber in meinem Editor habe ich zum Festlegen der Map-Größe einfach einen Dialog gebaut, der zwei Text-Felder besitzt, welche nur Ganzzahlen als Eingabe akzeptieren (s. Anhang (1)). Das bedeutet, dass sich der Nutzer beim Erstellen der Map festlegt, welche Größe sie haben soll (momentan kann man sie später auch nicht mehr ändern), sodass dynamisch Speicher reserviert werden kann, in welchem dann die Map-Daten abgelegt werden. In diesem arbeitet dann der Map-Editor.


Zum Editieren der Map musst du bei einem erst einmal die Maus-Koordinaten in Spielkoordinaten umrechnen, etwa so:

C-/C++-Quelltext

1
2
3
4
5
vec2 w; // Die Größe des Anzeige-Fensters
vec2 c; // Die Maus-Koordinaten relativ zum Anzeige-Fenster
vec2 p; // Bei einer Orthographischen-Projektion: <right-left, bottom-top>
vec2 o; // Offset deiner Camera
vec2 r = ((p / w) * c) - o;


r teilst du dann noch durch die Größe deiner Tiles, und rundest ab, und du hast die Tile-Koordinaten. Dann kannst du das Tile ändern. In Anhang (2) kannst du sehen, dass die Kamera etwas verschoben ist, die Tiles aber dennoch veränderbar sind.

Ich bin mir gerade wirklich unsicher, ob das deine Frage beantwortet. Ein weiterer Hinweis meinerseits vielleicht noch: Ich benutze ein ein-dimensionales Array (dynamisch erstellt wie oben beschrieben). Du scheinst ja auf der Suche nach einem passenden Container zu sein.

Liebe Grüße,
~ EuadeLuxe ~
»EuadeLuxe« hat folgende Bilder angehängt:
  • editorNewLevel.png
  • editorEditMode.png

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »EuadeLuxe« (28.06.2014, 12:17) aus folgendem Grund: Latex-Überbleibsel im C++ Code entfernt.


8

28.06.2014, 13:59

Danke, für die zahlreichen Antworten ^^

MFG
Sceiwen

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

9

29.06.2014, 02:09

Als Inspiration könnte dir ja auch Tiled dienen. Guck mal hier:
http://www.mapeditor.org/

Imho sehr gutes Design, da kann man sich viele schöne Features abgucken.
WIP Website: kevinheese.de

10

30.06.2014, 18:37

Das ist eigentlich gar nicht so schwer.
Zuerst brauchst du eine Datei, in der du die Werte deiner Tiles speicherst. Z.B: Steht an erster Position (1,2), so werden diese Informationen in einen 2 Dimensionalen Array gespeichert.
Diese Datei muss eingelesen werden und die entsprechenden Tiles gerendert.

Ein Editor würde das ganze umgekehrt machen. Er nimmt Input des Benutzers an (Mausklick zum platzieren eines Tiles (falls der Mauszeiger sich innerhalb von (0,0,16,16) befindet -> erstes Tile gewählt)) und schreibt die richtigen Informationen in die Datei.

Ich hab selbst schon viel mit Tile Maps gearbeitet und hab auch eine Klasse dafür in der SFML geschrieben.
Falls du willst kannst du mir mal eine PN schicken und ich erläutere dir alles genau.

MfG,
Cranberry

Ok, und wenn ich jetzte das Array mit den ganzen Werten habe, wie bekomme ich dann das Raster hin ? Ich meine irgendwie muss sich das Raster ja dem entsprechend scalieren.

Werbeanzeige