Map + Teleport

05/07/2012 05:51 Crack-wtf#1
Hey leute.
Ich habe mir vorgenommen, meinen Teleporter für DragonBallOnline etwas zu erweitern.

Ich dachte an folgendes.

Ein Bild von der Map/welt, bei welcher man seine Position wählen kann, und dann wird dahin teleportiert.

Nun ist das Problem, dass ich nicht weis, wie ich es anstellen soll, dass er die X,Z Coordinate richtig berechnet.

Hat jemand von euch eine Idee?
05/07/2012 16:42 -STORM-#2
Wie groß ist denn die Map.
Mein Ansatz wäre, die Größe der Map in Koordinateneinheiten auf die Größe der angezeigten Karte in Pixeln zu übertragen. Dazu einfach mit irgendeinem Faktor multiplizieren, damit es passt.

Bsp:
Die Map ingame hat die maximalen Koordinaten x:2000 und y:1500
Da könnte man z.B. eine Karte mit den Maßen 1000x750 machen. Somit würde jedes Pixel für 2 ingame Koordinateneinheiten stehen.

Dafür sollte es bestimmt irgendeinen Befehl geben, der erkennt auf welche Pixel du in dem Fenster klickst.

Diesen Wert müsstest du bloß wieder mit 2 multiplizieren, dann hättest du die Koordinaten, zu denen du dich portest.

Bloß ein Ansatz, die entsprechenden Befehle sollte man aber mit Google finden können.
05/07/2012 16:48 mydoom#3
[Only registered and activated users can see links. Click Here To Register...]

Habe ich nur schnell zusammengeklickt, kann auch total falsch sein.
05/07/2012 18:35 Lawliet#4
WinGetPos(), MouseGetPos() und _isPressed() sollten den rest erledigen.
Also
If _isPressed(..) then
$koords = MouseGetPos(...)
$WinPos = Wingetpos(...)
-verrechnen-
-teleportieren-
Endif
05/10/2012 18:27 Crack-wtf#5
Ist etwas kompliziert.
Die welt besteht aus einzelnen karten.
9 um genau zu sein.
Und diese sind aneinander hängend.
D.h. nicht jedes land fängt bei der position 0 an.
Und die Maps sind nicht quadratisch, d.h. ich kann nicht einfach in die obere linke ecke der map gehen, und dann in die untere rechte um die max. coordinaten zu holen, weil an der stelle evtl. Meer ist.
05/10/2012 18:37 Lawliet#6
Naja, da musst du dir halt eine Funktion machen, die dir das Umrechnet ;) Sei Kreativ :p
05/11/2012 15:02 mydoom#7
Mir fallen dazu folgende Lösungswege ein:

Weg A: Die "collision map"

Du erstellst dir zusätzlich zu deiner Minimap (1) noch eine "collision map" (2 auf meiner angehängten Grafik). Das ist einfach ein Bild, das nur aus Schwarz (RGB #000000) und Weiß (RGB #FFFFFF) besteht. Schwarz steht dann z.B.: für "verbotenes" Gebiet, das nicht betreten werden kann, weil dort eventuell ein See liegt oder andere Hindernisse den Weg blockieren.

Dann musst du einfach nur nach der Abbildung in meinem letzten Beitrag vorgehen und zusätzlich überprüfen, ob an der Teleport-Koordinate auf der collision map ein schwarzes oder ein weißes Feld liegt und eine Entscheidung treffen. (Die kann man einfach als Array laden und dann die Werte vergleichen)

Weg B: Dreiecke

Ansonsten könntest du diese "verbotenen" Gebiete mit Hilfe von Dreiecken markieren (3) und überprüfen, ob der Punkt, an den der Spieler teleportiert werden soll, innerhalb eines dieser Dreiecke liegt.

Das geht z.B. indem man bei einem Dreieck mit den Punkten A, B und C und der gewünschten Teleport-Koordinate P die Vektoren AP, AB und AC bildet. Dann stellt man das als Linearkombination dar:

AP = s * AB + k * AC

Jetzt berechnet man z.B. mit dem Gauss-Verfahren s und k.
Wenn die reellen Zahlen s und k folgende Bedingungen erfüllen, liegen sie innerhalb des Dreiecks:

0 < s,k < 1 und 0 < s+k < 1

Wie das ganze für n-Ecke mit n > 4 aussieht, kann ich gerade leider nicht sagen.

[Only registered and activated users can see links. Click Here To Register...]