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

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

05.05.2018, 17:49

externe Leveldatei für eine 2D Map

Hallo,
zur Übung habe ich mich mal hingesetzt und den A* Algorithmus gebastelt. Der Einfachheit halber gibt man vor Beginn die Länge und Breite des Grids an, den Startpunkt und den Zielpunkt. Zusätzlich legt man noch die möglichen Feldkosten fest, null wäre "nicht begehbar" / Hindernis.

Diese Feldkosten werden dann jeder Zelle zufällig zugewiesen, weil ich keine feste Map Struktur angebe. Das soll sich nun ändern, ich würde gerne in einer externen Datei die Karte definieren, dann auslesen und den Pfad berechnen lassen.

Hier mal ein Beispiel einer "schlechten" JSON Datei, ich lege alle Informationen fest und kann jeder Zelle noch zusätzlich benötigte Attribute zuweisen. Die Koordinaten ergeben sich von selbst aus den Schleifen bzw. dem 2D Array, daher muss die Zelle selbst nur weitere Informationen kennen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
  "1": [
    {
      "cost": 1
    },
    {
      "cost": null
    },
    {
      "cost": 3
    },
    {
      "cost": null
    },
    {
      "cost": 2
    }
  ],
  "2": [
    {
      "cost": 3
    },
    {
      "cost": 2
    },
    {
      "cost": null
    },
    {
      "cost": 1
    },
    {
      "cost": 2
    }
  ],
  "start": {
    "x": 3,
    "y": 5
  },
  "target": {
    "x": 8,
    "y": 2
  }
}


Ich bin mir aber relativ sicher, dass es für solche Pseudo Level Editoren passendere Dateiformate gibt, mit denen man ein Level darstellen kann. Prinzipiell geht es nur um eine 2D Karte, die sich von selbst anhand einer Struktur mit x und y hochzieht und Zellen eine bestimmte Anzahl an Attributen haben.

Sinnvoll wäre beispielsweise, Start und Ziel nicht separat anzulegen, sondern einfach an der passenden Zelle zu sagen du bist der Start. Vielleicht soll eine andere Zelle ein Gebäude halten und eine weitere einen Gegner. Oder ein Gebäude und einen Gegner.

Und das Ganze dann für m Zellen pro Reihe bei n Reihen. Kann jemand ein Dateiformat für Zellinformationen empfehlen?

equinox

Frischling

Beiträge: 56

Beruf: Student

  • Private Nachricht senden

2

05.05.2018, 19:08

Du könntest deine Map Objekte auch serialisieren und so speichern, dann müsstest du dir um die Datenstruktur überhaupt keine Gedanken machen. Es sei denn du willst das natürlich.
In dem Fall hilft dir Google mit "<Java/C#/...> serialization" weiter.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

05.05.2018, 23:40

Schau Dir mal TilEd an. Das ist ein generischer Leveleditor für 2D-TileMaps, und der exportiert in ein konfigurierbares XML-Format.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

4

06.05.2018, 15:34

das mache ich, danke

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

5

06.05.2018, 16:09

Hallo Garzec,
die einfachste Variante hierfür ist die bereits bestehenden Features für JSON in Unity zu verwenden oder einer der sehr bekannten und beliebten Bibliotheken wie Json.NET. Damit kannst du die Struktur direkt in C# angeben und die Library serialisiert und deserialisiert für dich das Objekt. Ganz ohne lästige Schleifen und unnötige Logik. Einfaches Beispiel:

C#-Quelltext

1
2
3
4
5
6
7
[Serializable]
public class MyClass
{
    public int level;
    public float someMana;
    public string veryCoolEnemyName;
}

wird dann in json wie folgt repräsentiert:

C#-Quelltext

1
2
3
4
5
{
  "level": 0,
  "someMana": 0,
  "veryCoolEnemyName": "Mario"
}

erreichen kannst du das ganz einfach mittels Unity Bordmitteln mit:

C#-Quelltext

1
2
3
4
5
6
var myClass = new MyClass();
var jsonString = UnityEngine.JSONSerializeModule.JsonUtility.ToJson(myClass);
System.IO.File.WriteAllText(@"D:\path.json", jsonString);
//und rückwärts
var moreJsonString = System.IO.File.ReadAllText(@"D:\path.json");
var myClassAgain = UnityEngine.JSONSerializeModule.JsonUtility.FromJson<MyClass>(moreJsonString);

Natürlich sind auch komplexerer Struktuten mit Arrays, Listen, Dictionaries und verschachtelungen und eigenen Datentypen möglich. Da sind dir eigentlich keine Grenzen gesetzt solange es "plain" Klassen sind (d.h. nicht von MonoBehaviour erben), sie als serialisierbar geflagged sind und einfachheitshalber alle Felder öffentlich sind wie im Beispiel. Eben ein Datencontainer.

Ganz zum Schluss, wenn es dir darum geht eine bessere Datenstruktur zu erzeugen, hilft die Normalisierung wie sie auch bei Datenbanken angewandt wird. Da viele Felder sicher die selben Kosten haben (sagen wir z.B. eine Grünfläche) und sich diesen Wert teilen, lohnt es sich sowas über Schlüssel wie in einer Datenbank zu verknüpfen. Dafür kannst du z.B. eine weitere json Struktur verwenden, die zum einen eine Id hat und dann den jeweiligen Wert/Kosten etc. Die Map als json Struktur ist dann lediglich eine Ansammlung von Id's auf Tiles. So kannst du z.B. das selbe Tile nur einmal im Speicher halten und referenzierst zisch Felder damit. Ich pack dir hierfür mal noch ein bisschen Links dazu:
https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
http://gameprogrammingpatterns.com/flyweight.html (schöne Inspiration und Erklärung wie eigentlich alles von Robert Nystrom :love: )
Liebe Grüße,
René

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Renegade« (06.05.2018, 16:47)


Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

6

06.05.2018, 19:08

Jup, das kenne ich schon ;)

Mir ging es nur um die Überlegung eines geeigneten Dateiformats.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

7

07.05.2018, 09:41

Ich bin der Meinung, man sollte sowas immer mit einer kleinen struct machen, die man binär serialisiert. Diese hat man dann im Speicher linear x mal hintereinander (x=Breite mal Länge der Karte) und genau so schreibt man sie auch in eine Datei. Das ganze geht dann mit einem einzigen Schritt, der y Bytes schreibt/liest (y=x mal Byte pro struct inkl. padding). Sowas sollte jede Bibliothek unterstützen und es ist um Faktor 100 schneller als z.B. Json.

8

15.05.2018, 09:55

In JSON würde ich solcherlei Topographien in einem Array Objekt ablegen, und die Breite und Höhe der Map separat.
Im einfachsten Fall hat dann jedes Tile einen Kostenwert, zB 0.5 für Strasse, 1 für Feldweg, 2 für Wiese, 4 für Gestrüpp, usw, und -1 für unbegehbar.

Das ganze würde ich dann so ablegen:
Data hat hier dann 3x3 = 9 Einträge.

{
"name" : "testmap",
"wide" : 3,
"high" : 3,
"data" : [0.5,0.5,1,0.5,3,-1,-1,4,-1]
}

Tiled ist für 2D Grid Maps ein gutes Tool um schnell Karten erstellen zu können, mit verschieden Formaten die ausgegeben werden können.
Ein CSV oder eigenes byte-format ist die bessere Wahl wenn die Karten sehr groß werden.
Auch könnte man hier die Daten komprimiert ablegen. (Zip oder Run-Length Encoding)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Damocles« (15.05.2018, 10:05)


Werbeanzeige