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

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

21

31.05.2013, 11:17

Die Layeranzahl könnte man ja im Prinzip auch beliebig gestalten. Tiled unterstützt afair 100 Layer. Da wird man ja erst mal nicht unbedingt beschränkt.


Ja, das stimmt. Entweder baut man pro Layer ein eigenes 2D-Array, was beim Rendern randüberschreitender Tile-Grafiken durchaus ein Vorteil ist, aber bei Tile-bezogenen Abfragen wie z.B. Kollisionstests hässliche Speicherzugriffsmuster verursacht. Aber ok, so kritisch ist das nicht. Oder man macht pro Tile ein kleines Array von Layern auf - das machen wir so. Dann allerdings sollte die Layer-Anzahl zur Compile Time feststehen, sonst hat man wieder eine Allokation pro Tile.
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.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

22

31.05.2013, 12:07

Ich hab schon beides umgesetzt. Für die Variante, bei welcher ein Tile die eigenen Layer kennt habe ich allerdings eine List verwendet. So muss die Größe nicht feststehen und in meiner Variante konnte ein Tile sich direkt von unten nach oben durch rendern, da die Layer wirklich genau übereinander waren. Kollision mache ich normalerweise unabhängig von den Layern. Jedes Tile hat unabhängig eine Information die festlegt ob mit dem Tile kollidiert wird oder nicht. Im Prinzip als eine Art extra Layer. So hat es mir persönlich bis jetzt immer am besten gefallen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

23

31.05.2013, 12:14

Eine std::list? Also eine Allokation pro Layer pro Tile? Hui... nuja, für kleinere Maps tut auch das nicht weh.

Kollision kann man so machen, ist eine prima Sache für z.B. Zelda-artige Spiele. Ich brauchte aber pixelgenaue Kollision, die sich dann aus der Grafik ableitet, also muss ich pro Map-Feld die Kollisionsmaps der Tiles aller Layer kombinieren. Da bietet sich es dann an, die lokal beieinander zu haben.
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.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

24

31.05.2013, 13:08

Also zum einen gibt es ja nicht nur std::map sondern auch noch std::unordered_map oder etwas eigenes. War ja nur ein Beispiel. Außerdem war im eingangspost ja nicht unbedingt nach der Effektivsten Lösung sondern allgemein nach einer Möglichkeit gefragt.

An den Kritiken kann ich nicht rütteln, das ist mir klar. Nur ich frage mich grad ob wir dem Thread Ersteller einen Gefallen tun. Ziel der von mir vorgestellten Lösung war auch eher ihre Einfachheit seinen Bedarf zu erfüllen als die maximale Effizienz.
:love: := Go;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

25

31.05.2013, 14:01

Hm. Einfach ist der Vorschlag zweier geschachtelter Maps schon, da hast Du Recht. Ich halte den Vorschlag aber für gefährlich. Das ist dann eben kein 2D-Feld aus Tiles mehr, sondern eine lose Sammlung Tiles anhand ihrer Koordinaten. Kann man machen, hat aber hintenraus einiges Potenzial für unerwartetes Verhalten und Inkonsistenzen.
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.

26

31.05.2013, 17:31

Wenn überhaupt mit Maps, sollte man statt zwei geschachtelter Maps eine einzige Map mit einem komplexen kombinierten Schlüssel nutzen. Dann kann man ziemlich gut alle möglichen Konstellationen abbilden (unterschiedliche Ebenen, X/Y/Z-Koordinate, Spielzustände...). Im Grunde läuft es ja auf eine Funktion hinaus: getTile(int x, int y, int layer)...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (31.05.2013, 17:36)


Durza

Treue Seele

Beiträge: 104

Beruf: Student (MSc Cyber Security)

  • Private Nachricht senden

27

31.05.2013, 17:55

Ich hab dazu einmal ein schönes Tutorial gesehen:


In späteren Teilen wird das System immer weiter erweitert (so zB. auch das dynamische Festlegen der Grösse von der Map).

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

28

31.05.2013, 20:28

@Schrompf: Das mit den Listen war bei einer kleineren .Net Spielerei. Geschwindigkeitstechnisch war das alles überhaupt kein Problem. Viele Layer waren es am Ende nicht. Ich glaube bis zu 4 Layer gab es insgesamt und für Kollision gab es ein extra Bool Attribut im Tile. Pixelgenaue Kollision ist wieder etwas ganz anderes. Wobei ich letztens mal darüber nachgedacht habe inwieweit Pixelkollision nötig ist. Ich glaube wenn man mit einfachen Shapes arbeitet bringt das auch fürs Verhalten schnell Vorteile mit sich. Wirklich pixelgenaue Kollision benötigt man glaube ich eher selten. Ist natürlich auch eine Aufwandsfrage. Pixelkollision muss man ein mal implementieren und so Shapes müssen beim Map bauen halt irgendwie mit eingearbeitet werden. Das kann natürlich schnell zu Mehraufwand für den Leveldesigner sorgen.
Mit den geschachtelten Maps, bzw einer einzigen Map, das kann man natürlich machen, muss man aber nicht;) Ich wüsste nicht warum das viel einfacher sein sollte als mit einer anderen Datenstruktur. Wenn man mit std::vector arbeitet, so holt der selbstständig neuen Speicher. Wenn man nicht mit verschachtelten vectoren arbeitet muss man natürlich selbst dafür sorgen, dass die richtigen Daten an der richtigen Stelle sind. Wenn ich es mir einfach machen wollte würde ich einfach mit geschachtelten std::vector arbeiten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

29

02.06.2013, 20:04

Ich melde mich auch mal wieder :D

Also einen Gefallen habt ihr mit dieser Diskussion schon getan, meine Fragen waren zwar geklärt, aber es ist trotzdem sehr interessant die verschiedenen Möglichkeiten durchzugehen.

Ich programmiere zwar schon seit einiger Zeit und habe mir ein relatives Wissen angehäuft, allerdings bin ich noch nicht soweit, um hier viel über performance usw mitzureden. Das war der einzige Grund, warum ich mich nicht eingemischt habe, aber den thread habe ich gespannt verfolgt ;)

Ich möchte mich noch einmal für die Beantwortung meiner eigentlichen Fragen bedanken und auch für die interessante Diskussion ;)


Also ich arbeite zurzeit mit 3 Layern. Einmal der normale Boden, dann verschiedene Objekte(ohne Interkation) und "Türen"(unischtbares Layer). Es wird aber noch mindestens eins für interagierbare Objekte hinzukommen ;)

Werbeanzeige