PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Entfernung berechnen??



PrinZZ
21.02.2007, 20:04
Hallo liebe Communitiler,
Ich habe mich gefragt, (unter anderem weil es meinem Projekt sehr helfen würde) ob man irgendwie die Entfernung zwischen 2 Events berechnen Kann...

Gruß PrinZZ

Kopp
21.02.2007, 20:49
Auf ner gerade Linie is das einfach:

X-Koordinate der Helden | -
X-Koordinate des Events | =
Differenz

Das kannst du dann mit den Y-Koordinaten wiederholen und hast dann die Differenzwerte. Wenn du auch so das Diagonale brauchst, bin ich grad ein wenig ratlos, aber dir fällt sicher was ein.

Kopp

PrinZZ
21.02.2007, 21:25
Hey vielen dank! Ich hab nur das auf der Geraden gebraucht =) http://www.multimediaxis.de/images/smilies/old/sm_12.gif


Da fällt mir noch ne Frage ein, und da eröffne ich nicht gleich n neues Thema!
Also: Wie kann ich als Fork machen, dass Der Hero ein bestimmtes Event angugg(anguggn muss)?

Gruß PrinZZ

Kaat
21.02.2007, 21:54
Du ermittelst (genau wie bei den Entfernungen), wo vom Hero aus gesehen das Event sich befindet (X-Differenz = 1: Hero rechts vom Event; X-Differenz = -1: Hero links vom Event; Y-Differenz = 1: Hero unter Event; Y-Differenz = -1: Hero über Event). Dann fragst du mit Fork Condition ab, in welche Richtung dein Hero guckt, eben abhängig von der vorher ermittelten Position. Steht er rechts, muss er nach links schauen, und so weiter...

Einfacher ist es, wenn dein Event ein NPC ist, der den Hero auch anschauen darf, wenn dieser hinschaut. Dann machst du einfach ein "Move Event" für den NPC und gibst den Befehl "Face Hero". Dann fragst du die NPC-Face Direction ab und danach, ob der Hero in die entgegengesetzte Richtung schaut. Da sparst du dir die Rumrechnerei, die ich persönlich sehr lästig finde. ;)

PrinZZ
21.02.2007, 22:10
Und wie berechne ich ob er in die entgegengesetzte richtung schaut?
Sry ich steh irgendwie auf m schlauch ^^

Gruß PrinZZ

Phönix Tear
21.02.2007, 23:11
Leider ist es nicht ganz so einfach wie Kaat es beschrieben hat (aber trotzdem einfacher als der Text lang ist. Es ist nur schwer zu beschreiben ^^°). Würde man eine solche Verschachtelung der Forks baun:

<>Fork X-Differenz -1
<><>Move Event "(NPC) Face Left"
<>Else:
<>Fork X-Differenz +1
<><>Move Event "(NPC) Face Right"
<>Else:
<>Fork Y-Differenz -1
<><>Move Event "(NPC) Face Up"
<>Else:
<>Fork Y-Differenz +1
<><>Move Event "(NPC) Face Down"
<>End:
<>
würde der NPC nur dann nach oben, bzw. unten schauen, wenn der Held genau auf einer vertikalen Linie mit ihm sehen würde. An sonsten gilt ja, dass die X-Differenz != 0 ist. Damit schaut er entweder nach links oder nach rechts.
Um das zu vermeiden muss man eine etwas kompliziertere Methode wählen.
Dazu sollte man sich erst einmal im klaren sein, wann der NPC dem Helden wie hinterherschaut. Denn schließlich kann der Held auch schräg über ihm stehen.
Logischerweise legt man dazu eine art X (man könnte es auch Kreuz nennen) auf den NPC (hier in Form von Rasen verdeutlicht):
http://www.directupload.net/images/070221/8f5i2U6n.png
Natürlich haben wir im Projekt selbst keinen Rasen zur markieren. Das dient nur als Denk- und Erklärstütze ;)
So, solange der Held nun im linken "Dreieck" ist (die Dreiecke werden jeweils von zwei Rasendiagonalen und dem Bildschirmrand gebildet), soll der NPC nach links schauen. Ist der Held im oberen, nach oben, etc.
Nun müssen wir also eine Prozedur entwickeln, mit der wir feststellen, wann der Held in welchem Dreieck ist.
Dazu betrachten wir am besten die X- und Y-Differenz Variablen.
Wie die errechnet werden wurde ja schon erklärt:

<>Change Variabel "X-Differenz", set [(Hero) X-Coord.]
<>Change Variable "Y-Differenz", set [(Hero) Y-Coord.]
<>
<>Change Variable "X-Differenz" - [(NPC 1) X-Coord.]
<>Change Variable "Y-Differenz" - [(NPC 1) Y-Coord.]
<>
Nun zum eigentlichen Code, welcher den NPC dreht:

<>Call "Differenz" //Dazu siehe unten
<>Fork Variable "X-Differenz" < 0
<><> //Der NPC ist rechts vom Helden
<><>Call "Betrag" //Dazu siehe unten
<><>Fork Variable "Y-Differenz" <= "X-Differenz"
<><><>Move Event "(NPC 1) Face left"
<><><>Goto !Lable 1!
<><>End:
<>End:
<>Call "Differenz"
<>Fork Variable "X-Differenz" > 0
<><> //Der NPC ist links vom Helden
<><>Call "Betrag" //Dazu siehe unten
<><>Fork Variable "Y-Differenz" <= "X-Differenz"
<><><>Move Event "(NPC 1) Face right"
<><><>Goto !Lable 1!
<><>End:
<>End:
<>Call "Differenz"
<>Fork Variable "Y-Differenz" < 0
<><> //Der NPC ist unter dem Helden
<><>Move Event "(NPC 1) Face up
<><>Goto !Lable 1!
<>Else:
<><> //Der NPC ist über dem Helden
<><>Move Event "(NPC 1) Face down
<>End:
<>
<>!Lable 1!
<>
Hierbei verwende ich mehrfach die Events "Differenz" und "Betrag". Diese kannst du als Seiten im Event einbauen oder als CEs benutzen, aber auch gleich in den Code integrieren. Ich hab das einfach ausgelagert, um es übersichtlicher werden zu lassen. Beide haben nur recht kurzen Code:

Differenz:
<>Change Variabel "X-Differenz", set [(Hero) X-Coord.]
<>Change Variable "Y-Differenz", set [(Hero) Y-Coord.]
<>
<>Change Variable "X-Differenz" - [(NPC 1) X-Coord.]
<>Change Variable "Y-Differenz" - [(NPC 1) Y-Coord.]
<>

Betrag:
<>Fork Variable "X-Differenz" < 0
<><>Change Variable "X-Differenz" * (-1)
<>End:
<>Fork Variable "Y-Differenz" < 0
<><>Change Variable "Y-Differenz" * (-1)
<>End:
<>
Sooo, damit wärst du dann auch schon fertig.
Was haben wir da oben jetzt aber genau gemacht?
Dazu müssen wir zuerst wissen welche Koordinaten der Rasen hat. Da wir aber nicht davon ausgehen, dass der NPC statisch ist, müssen wir uns ein System ausdenken, bei dem wir das gedachte Rasenkreuz mitwandern lassen können. Dazu brauchen wir eine Formel zum errechnen der Koordinaten der einzelnen Rasenfelder. Diese ist bestechend einfach:
Wenn die Differenz von NPC zum Feld in X-Richtung gleich der Differenz von NPC zum Feld in Y-Richtung ist, dann wäre dies ein Rasenstück.
Ein Beispiel:
Der NPC steht auf (5|8), wir wollen die Felder (7|10) und (9|12) kontrollieren.
(7|10) - (5|8) = (3|2)
3 != 2 -> Kein Rasenstück

(9|12) - (7|10) = (2|2)
2 = 2 -> Rasenstück
Damit wissen wir, wie wir die Dreiecke bilden können. Und genau das mache ich auch im Code.
Dazu frage ich erst einmal ab, wie der Held überhaupt zum NPC steht.
Steht der Held links vom NPC muss ich also prüfen ob seine Y-Differenz nicht größer ist als die X-Differenz. Wäre dem so, würde er außerhalb des Dreiecks stehen. Damit ich nicht viel mit Forks rumhantieren muss, bilde ich einfach den Betrag beider Differenzen und frage, ob Y-Differenz <= X-Differenz ist. Wenn ja steht der Held im Dreieck. Dementsprechend muss sich der NPC zu ihm (nach links) drehen. Der Rest des Codes kann dann übersprungen werden ("Goto !Lable 1!").
Sollte der Held nun aber nicht im Dreieck gestanden haben, wird die andere Seite überprüft (allerdings nur wenn der Held auch rechts vom NPC steht). Dort kann (wieder durch den Betrag) das selbe Verfahren angewandt werden.
Ist der Held auch in diesem Dreieck nicht aufzufinden muss er also entweder im Dreieck über oder unter dem NPC stehen. Daher muss ich jetzt nur noch abfragen ob die Y-Koordinate des NPC größer oder kleiner ist als die des Helden. Je nachdem wird dann der NPC gedreht.
Fertig

Ich hoffe es ist einigermaßen verständlich ^^°

mfg
Phönix Tear