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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

02.01.2016, 19:07

Danke für den Hinweis und den Beispielcode, mit Exception ist das eine sehr elegante Lösung :)

Nö ist es nicht. Nochmal meine Frage von vorhin: Wozu genau dient dieser Key überhaupt?

12

03.01.2016, 10:58

Der Key wird für die Kollisionserkennung benötigt. Jeder Key steht in der map für eine Raute. Und jeder Raute sind eine Liste / jetzt ein Vector von Einheitenpositionen zugeteilt.

D.h. befindet sich eine Einheit in Raute (X,Y) werden zur Kollisionserkennung die Positionen aller Einheiten in den Rauten:
(X - 1,Y - 1) + (X,Y - 1) + (X + 1,Y - 1) + (X - 1,Y) + (X,Y) + (X + 1,Y) + (X - 1,Y + 1) + (X,Y + 1) + (X + 1,Y + 1)
betrachtet.

Der Key einer Raute wird nun folgendermaßen berechnet:
X + Y * (Anzahl an Rauten in Y-Richtung)

Über den Key kann ich also die Liste / den Vector mit den Positionen der umliegenden Einheiten gezielt anfragen. Damit muss ich nicht alle Einheiten auf dem Spielfeld betrachten, sondern nur die in den umliegenden Rauten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

03.01.2016, 11:10

Wieso nicht einfach ein 2D Array machen?

14

03.01.2016, 11:56

Weil ich nicht weiß, wie ich einen std::vector in ein 2D Array einspeichern kann.

Ist dies möglich? :)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

15

03.01.2016, 13:04

Du hast doch schon wunderbar das Mapping von einer 2D Position auf eine 1D Position realisiert. Was du brauchst ist somit eigentlich nur noch ein 1D Array, statt einer Map. Zuviel will ich an der Stelle aber nicht verraten :P .

P.S. Lösung für 2D Array sähe ungefähr so aus: std::vector<sf::Vector2f> Rauten[width][height]; (ggf sind width/height vertauscht). Aber eigentlich ist die Nutzung eines 1D Arrays auch nicht verkehrt-gerade wenn es später mal dynamisch allokiert werden soll.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

16

03.01.2016, 13:11

An Stelle einer Liste von Einheiten, die sich gerade auf einem Feld (nicht Raute) befinden, solltest du evtl. allgemein die Informationen über das Feld speichern (also bspw. eine Instanz der Klasse Feld/Field/GridCell/...). Diese Informationen beinhalten u. a. auch die Einheiten, die sich auf dem Feld befinden.
Wenn es häufiger vorkommt, dass du die Nachbarn eines Feldes erfragen willst, wäre es weiterhin eine Option, zusätzlich die umliegenden Felder zu referenzieren (Pointer/Referenz/Smartpointer/...)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

03.01.2016, 13:54

Weil ich nicht weiß, wie ich einen std::vector in ein 2D Array einspeichern kann.

Ist dies möglich? :)

Der Key einer Raute wird nun folgendermaßen berechnet:
X + Y * (Anzahl an Rauten in Y-Richtung)

:hmm: ... ;)

18

03.01.2016, 14:28

@nox && dot:

C-/C++-Quelltext

1
std::vector<std::vector<sf::Vector2f>> DoppelterVektorMitKoordinaten;

Habe es jetzt noch nicht implementiert, aber so sollte es glaube ich gehen.
std::vector statt einem Array. Von 2D auf 1D gehe ich ja sowieso, mit der std::map habe ich wohl ein bisschen zu kompliziert gedacht... :dash:

@Sacaldur:
Darüber habe ich auch nachgedacht, ich war nur ehrlich gesagt ein bisschen zu faul meine Funktionen über den Haufen zu werfen... ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

03.01.2016, 14:38

@nox && dot:

C-/C++-Quelltext

1
std::vector<std::vector<sf::Vector2f>> DoppelterVektorMitKoordinaten;

Habe es jetzt noch nicht implementiert, aber so sollte es glaube ich gehen.
std::vector statt einem Array. Von 2D auf 1D gehe ich ja sowieso, mit der std::map habe ich wohl ein bisschen zu kompliziert gedacht... :dash:

jap ;)

20

03.01.2016, 14:42

Vielen Dank euch! ;)

Dann korrigiere ich meine Aussage von vorher: So ist es eine elegante Lösung (zumindest für mich :thinking: )!

Werbeanzeige