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

03.01.2011, 21:27

Kartenumstellung

Guten Abend!

Ich will mein Karten - System umstellen.
Bisher habe ich es so gemacht, dass ich ein Tile - Basierendes System habe, in dem die Konfiguration (Eine Struktur) in einer std::list gespeichert wird.
Ich hätte es jetzt aber gerne so, dass ich meine Konfiguration der Tiles nicht mehr in einer List, sondern eben zwei - Dimensional spiechere.

Nun stellt sich ich mir die Frage, ob es etwas gibt, das eine std::list darstellt, nur eben mit zwei Dimensionen?
Oder ob ich ein Array mit 2 Dimensionen verwenden sollte?

Ich hoffe, das war verständlich :)
Liebe Grüße und noch einen schönen Abend,
Ombalat

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

2

03.01.2011, 21:58

2 dimensionale Listen kannst du so machen:
std::list< std::list > TileList;
aber nicht gerade sinnvoll.

Für was brauchst du denn genau so eine Umstellung?
Willst du auf die einzelnen Tiles per []operator zugreifen?
Wenn ja kannst ja einen std::vector benutzen oder halt ganz normale Arrays
New Project: Operation CityRacer

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

3

03.01.2011, 22:01

Du könntest z.B. zwei Listen inneinander verschachteln. Also eine Liste die Listen von Tiles hält.

Edit: verdammt zu langsam (ich hätte doch auf aktualisieren gehen sollen).
Zwei ineinander verschachtelte Listen hätten den Vorteil, dass auch nicht-rechteckige Karten möglich wären (allerdings fällt mir nicht ein wann das sinnvoll sein könnte).
In Java sind übrigens auch nicht-rechteckige 2dimensionale Arrays möglich.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »foreach« (03.01.2011, 22:07)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

03.01.2011, 22:29

std::list sollte man sowieso nur verwenden wenn man oft einzelne elemente der der mitte der liste einfügen oder erstellen will. mir fällt keine tilemap-art ein bei der verschachtelte listen sinnvoll wären. am einfachsten wären verschachtelte std::vectoren wie oben genannt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

03.01.2011, 22:46

Ich würde einen eindimensionalen std::vector verwenden oder einfach direkt ein array und das ganze in einer Klasse verpacken. Oder gibt es einen Grund warum es eine std::list sein muss!?

6

03.01.2011, 22:49

Ich wollte es umstellen, weil ich mir denke, dass es so einfacher zum bedienen ist.
Sonst hab ich nämlich alle Elemente der Karte in einer Liste, wo ich mir (für kollisionerkennungen auf der Karze z.B.) sonst immer erst errechnen muss, welche stelle der Liste ich abfragen muss ... Also wenn ich jetzt z.B. eine Karte mit 16x12 Tiles habe, hab ich eine Liste mit 192 Einzel - Tiles, wovon ich dann umrechnen muss.

Und in 2D müsst ich eben nicht immer die umrechnung von den Tiles in die Liste machen
(Also sprich "Ich bin auf dem 2. Feld in der 2. Reihe bei 12x12 Tiles => Tile 14 Abfragen", sonder könnte das eben "direkt" abfrageb (Tile 2 der 2. Reihe))

Ein weiterer Grund ist, dass ich vorhabe, möglicherweise eine Karte zu erstellen, die größer ist als der angezeigte bereich (Sprich eine Karte, bei der man scrollen kann) .. Das stell ich mir in 2D einfach besser vor ...

Oder soll ich besser einfach bei der "alten" Lösung mit der List bleiben und es mit der Lösen ?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

03.01.2011, 22:51

Für wahlfreien Zugriff über Indices ist eine std::list der denkbar schlechteste Container den man sich nur vorstellen kann. Nimm einfach einen eindimensionalen std::vector und verpacke den in einer Map Klasse die dir eine Methode zur Verfügung stellt die die Umrechnung von 2D nach Index übernimmt. Das wäre einfach und sehr effizient.

8

03.01.2011, 23:07

Oke, vielen Dank für deinen Ratschlag! Werde es so machen :)

Schönen Abend!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

04.01.2011, 00:04

Wobei du bei einem 2d Array die Rechnung schon gegeben hättest. Weiß nicht was da der Compiler so an Optimierung noch bringt. Von daher spricht meiner Meinung nach nichts gegen 2 Dimensionen im Container. Wobei ich meinem Vorposter aber auch recht geben muss. Wenn dein Container Eindimensional ist dann schreib dir einfach eine Methode die direkt den Index umrechnet.
„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.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

04.01.2011, 00:16

Wobei du bei einem 2d Array die Rechnung schon gegeben hättest. Weiß nicht was da der Compiler so an Optimierung noch bringt. Von daher spricht meiner Meinung nach nichts gegen 2 Dimensionen im Container.

Ein 2D Array ist etwas ganz anderes als ein std::vector<std::vector<T>>, schon rein semantisch (verschachtelte vectoren entsprechen einem jagged Array). Beim 2D Array kümmert sich der Compiler um alles, allerdings wird ihm ein Array fixer Größe wohl nicht viel bringen. Und beim vector aus vectoren gibt es nichts was der Compiler da groß optimieren könnte.

Werbeanzeige