mmofacts.com

Runde Map

gepostet vor 17 Jahre, 8 Monate von fr33k4
Guten Abend Leute,
bevor ihr euch denkt: "Nicht schon wieder einer, der wissen will wie man eine Karte erstellt". Nein, meine Karte steht schon und funktioniert einwandfrei. Aber ein Problem hätte ich doch noch bei meiner Karte. Es wäre sogesehen nur ein Zusatz, nichts notwenidiges, das ich aber trotzdem gerne einbauen würde.
Nehmen wir als Beispiel das Browserspiel Travian. Wenn man sie die Karte von Travian anschaut, bemerkt man das Travian eine runde Welt hat. Wenn man z.B. bei Koordinaten x 400 | y 400 ankommt, merkt man dass die Karte x -400 | y -400 weiter geht. Sozusagen werden Koordinaten von vorne angezeigt. Die Map hat also "kein Ende/ kein Rand".
Ich habe jetzt einiges ausprobiert. Ich kriege das einfach nicht hin. Hätte evtl jemand eine Idee, wie man dieses Problem am besten lösen könnte?
Meine Koordinaten lese ich mit der folgenden Möglichkeit ab:
SELECT * FROM karte WHERE x BETWEEN -4 AND 4 && y BETWEEN -4 AND 4

Viel Dank schon Mal.
Mfg fr33k4
gepostet vor 17 Jahre, 8 Monate von Angua
Wir haben das bei uns "Wrap-Around" (also herumwickeln) genannt. Im Prinzip hast du eine Weltgröße in X und Y: max_x und max_y. Wir haben bei uns Koordinaten zwischen 0 und max_x genommen, nicht zwischen - max_x und max_x (bei negativen Koordinaten hilft dir dieses Beispiel nicht viel)
Als Beispiel zuerst die X-Behandlung. Alles zwischen 0 und X ist auf der Karte und kann direkt aus der DB gelesen werden. Bei allen anderen Koordinaten müsstest du Koordinate modulo max_x nehmen.
$real_x = ($virt_x % $max_x);
if ($real_x < 0)
$real_x += $max_x;
Genauso mit Y. Wenn du oben aus der Karte gehst, kommst du unten wieder rein usw. Die Kartendaten in der DB sind ganz normal zwischen 0 und X gespeichert.
Wir hatten auch eine Wrap-Around-Karte, haben sie aber inzwischen abgeschafft. Die Komplexität liegt aber darin, dass viele Objekte bei uns auf der Karte aus mehreren nebeneinanderliegenden Feldern bestehen, man also bei sehr vielen Stellen im Code auf Wrap-Around testen mussten. Das war nicht nur ein Perfomance-Problem, sondern hat auch die Entwickler zu sehr von wichtigeren Sachen abgehalten. Für viele neue Spieler ist es glaube ich auch verwirrend, und mit der echten Welt hat es auch nix zu tun.
gepostet vor 17 Jahre, 8 Monate von Todi42
Am einfachsten wird es wohl, in dem Du unterscheidest, ob Du in die Mitte der Karte guckst, oder ob Du auf die "Naht" guckst. Der erste Fall ist trivial im zweiten Fall, mußst Du halt zwei Streifen aus der Datenbank lesen, das kannst Du in Deinem SQL-Statment erreichen, in dem Du eine zusätzliche Bedingung mit OR hinzufügst.
gepostet vor 17 Jahre, 8 Monate von BjoernLilleike
Ich nutze auch den Modulo-Test, allerdings hat sich bewährt, die Karte nur in einer Richtung umlaufen zu lassen.
Bevorzugt in X-Richtung, so wie man einen Globus in der Regel um die Polkappen dreht und nicht frei im Raum. Dann klappt es auch mit der Orientierung der Spieler.
gepostet vor 17 Jahre, 8 Monate von Toby
Ich arbeite mit 2 Koordinatensätzen, wobei der 2 zum ersten versetzt ist. Damit kann ich mit einem Query alle benötigten Felder holen, egal wo ich gerade bin.
Code kann man hier sehen:
trac.openhope.de/trac/browser/frontend/trunk/libs/map.inc.php
Funktioniert prima und ist durch seine Schlichtheit auch recht performant.

Auf diese Diskussion antworten