PDA

Vollständige Version anzeigen : Abmessen der Nähe des Gegner


Heaven
21.02.2003, 01:57
Jo hab ne Frage:

Wie mach ich eine Anzeige in Varis die angibts wer der Nächste gegner ist?Und wie vergleicht man dann die Gegner untereinander am besten?

Furify
21.02.2003, 03:37
irgendwie kapier ich nicht was du meinst...

meinst du sowas ähnliches wie im ks von ffX ???
erklär mal genauer...

Graymon
23.02.2003, 03:28
Das ist jezt nur Theorie aber vieleicht hilfts.
Du kontrolierst wo die Feinde stehen und spiecherst es in einer Variablen (X und Y) dann speicherst du die Variablem wo dein Held steht.
Jeztr musst du X un Y von jedem Feind einzeln addieren und per Fork abfragen welcher den grössten weg zu dir hat.

Du könntest auch die Position vom Feind minus deine Position zu einem Bezugspunkt berechnen und einen Festen Punkt mir zu haben. Ich hoffe das ging so ungefaehr, wenn nicht dann E-Mail mir und ich bastel dir ne Demo

Heaven
23.02.2003, 03:48
mmm thx aber wie vergleich ich z.b drei gegner am besten untereinander?
schick bitte trotzdem:

andreasbaulig@web.de

Gekiganger
23.02.2003, 04:33
Nun ja, so einfach kann man es sich leider nicht machen und einfach X- und Y-Koordinaten addieren. Dann bekommt man nämlich alles, nur nicht die direkte Entfernung.

Was jedenfals nötig ist, ist, die X- und Y- Entfernungen von Gegner zu Hero zu bestimmen.
Dazu setzt man jeweils die X- und Y- Koordinaten von Gegner und Hero in verschiedene Variablen und zieht die Koordinaten des Heros von denen des Gegners ab.
Grafisch dargestellt sähe das dann so aus:


G
|
|
|
H------------


Legende:

H = Hero
G = Gegner
- = X-Entfernung
| = Y-Entfernung


Denjenigen, die in der Schule gut aufgepasst haben, fällt jetzt auf, dass wenn man die direkte Entfernung vom Gegner zum Hero hin einzeichen würde, ein Dreieck entstehen würde und zwar ein ganz besonderes, ein rechtwinkliges!

/ G
/ |
/ |
/ |
H---------

Wie wir alle (hoffentlich) ja wissen, ist diese schräge Linie die Hypothenuse. In unserem Fall also die direkte Entfernung. Sie kann mit dem "Satz des Pythagoras" errechnet werden:



a² + b² = c²



"a" ist in unserem Fall die X-Entfernung, "b" die Y-Entfernung. "c" ist die Schräge Linie, die direkte Entfernung (Hypothenuse). "a" und "b" sind uns gegeben, "c" suchen wir.

/ G
c / |
/ | b
/ |
H---------
a

"a" und "b" setzen wir in die Formel ein und erhalten "c²". Dies ist jetzt die Entfernung von Gegner zu Hero, allerdings nicht die direkte sondern die quadratische. Mit ihr kann man aber trotzdem schon feststellen, welcher Gegner dem Hero am nähsten ist. Der Gegner mit dem niedrigsten "c²" ist dem Hero am nähsten, der mit dem höchsten Wert ist am weitesten entfernt. Diese verschiedenen Werte kannste dann ja untereinander vergleichen und so herausbekommen, welcher am nähsten ist.

Allerdings weißt Du jetzt nicht, wie weit der Gegner vom Hero entfernt ist sondern nur, welcher näher ist und welcher weiter weg.
Wenn Du also die genaue Entfernung noch wissen willst, musst Du aus "c²" die Wurzel ziehen.
Und jetzt stellt sich uns ein Problem in den Weg. Das Quadrat (²) können wir ja einfach errechnen, indem wir "a" bzw. "b" mit sich selbst multiplizieren, z.B.: "a*a=a²". Doch der Maker besitzt keine Wurzelfunktion und wir wollen ja nicht "c²" erhalten sondern "c". Leider kenne ich grade keine Möglichkeit, mit den vom Maker gegebenen Mitteln die Wurzel auszurechnen.
Aber es gibt eine andere Möglichkeit:
Wenn a² + b² kleiner gleich c² sind heißt dies, dass sie sich innerhalb eines kreisförmigen Gebiets um den Hero herum befinden. "c" legen wir diesmal also fest und berechnen es nicht erst. Als ersten Wert für "c" nehmen wir 1. Das wird in die Formel eingesetzt. Sind also a² + b² kleiner gleich c², ist die direkte Entfernung von Gegner zu Hero c.a. 1. Sind sie größer als c², liegen sie außerhalb des Kreises. Das heißt also, wir müssen den Kreis erweitern. Also erhöhen wir den Wert von "c". Soll das Ergebnis sehr genau sein, erhöhen wir ihn um 1. Allerdings kann es dann bei vielen Wiederholungen dazu kommen, dass der Maker zu lange braucht, weil jede Wiederholung ja eine gewisse Zeit braucht. Ältere Rechner können so auch stark ins Ruckeln geraten.
Du musst also selbst entscheiden, um wieviel Du den Wert erhöhen willst.
Allgemein gilt: je geringer der hinzuaddierte Wert, desto genauer und hardwarehungriger, je höher der hinzuaddierte Wert, desto ungenauer aber weniger hardwarehungrig.

Das ganze muss sich jetzt so lange in ner Schleife wiederholen, bis a² + b² kleiner gleich c² sind oder c ein vorher angegebenes Maximum erreicht hat, sonst käme es ja unter Umständen zu einer Endlosschleife.

So, und das ganze machst Du jetzt für jeden Gegner. Zu dem Gegner, bei dem "c" den geringsten Wert hat, ist der Hero am nähsten, zu dem mit dem höchsten "c" Wert ist er am weitesten entfernt.
Natürlich musst Du für jeden Gegner andere "c" Variablen benutzen, sonst würden sich die Werte ja überschreiben. Außerdem musst Du c² in einer weiteren, temporären Variable auslagern.

Das ganze ist jetzt ziemlich mathematisch, aber eigentlich macht man sowas schon in der sechsten oder siebten Realschulklasse und jeder sollte was damit anfangen können... naja... "sollte" :D ;D



Edit:

Um nochmal auf das einfache Addieren der X- und Y-Entfernungen zurückzukommen, wie es Graymon vorgeschlagen hat:

Angenommen wir haben zwei Gegner:

Gegner1: X-Entfernung=0, Y-Entfernung=9
Gegner2: X-Entfernung=5, Y-Entfernung=5

Addiert man diese Werte nun zusammen, so beträgt die Entfernung beim ersten Gegner 9, beim zweiten Gegner 10.
Folglich wäre der erste Gegner näher am Hero. Dies ist aber falsch!


Jetzt rechnen wir es mit dem Pythagoras:

Gegner 1: 0² + 9² = 81 --> Wurzel --> 9
Gegner 2: 5² + 5² = 50 --> Wurzel --> 7

Dies ist jetzt die direkte Entfernung und wie man sieht ist diesmal der zweite Gegner näher am Hero, was auch richtig ist.

Mephisto
25.02.2003, 22:08
@ Gekiganger:
Und wie kann man feststellen, ob der Gegner überhaupt in Sichtweite ist? (Ich brauch es für mein Spiel beim Zaubern)

Gekiganger
26.02.2003, 01:14
Wie soll Deine Sichtweite denn aussehen?
Soll der Gegner auf dem Screen zu sehen sein, soll er in einem künstlichen Feld um den Hero herum sein oder soll vom Hero ein Sichtkegel auf nach vorne gehen und der Gegner soll darin sein?

Schattenläufer
26.02.2003, 20:48
Ich verstehe nicht ganz, was Gekiganger da mit c² meint. Wenn man a und b hat, muss man diese doch nur noch addieren, da wir ja mit bestimmten Planquadraten arbeiten. Da du ja wahrscheinlich nicht schräg gehst, musst du einfach das machen, was er am Anfang gemacht hat (die Differenz von Held X und Gegner X, Held Y und Gegner Y).

Dann muss man allerdings aufpassen, wenn man X und Y addiert, ist eine der beiden Zahlen nämlich negativ, so wird die Zahl kleiner, statt größer. Also: Fork Condition: wenn eine der Variablen negativ ist, musst du sie mal -1 nehmen, um das positive Gegenstück zu bekommen.

Mephisto
26.02.2003, 22:04
Ob der Gegner am Screen zu sehen ist.

Gekiganger
27.02.2003, 01:08
@ Mephisto

Dazu legst Du erst die Scene X- und Scene Y- Koordinaten für den Gegner fest.
Jetzt fragst Du in nem Fork ab, ob die Scene X Variable above 0 ist. In diesen Fork kommt ein weiterer, in dem abgefragt wird, ob die Scene X Variable below 320 ist. In diesen Fork kommt wieder ein Fork, der abfragt, ob die Scene Y Variable above 0 ist und darin kommt einer der abfragt, ob die Scene Y Variable below 241 ist.
Also insgesamt vier ineinander verschachtelte Forks. Bei der letzten Fork muss deswegen der Wert 241 eingetragen werden, da die Scene Y Koordinate einen Pixel unter dem Gegnerevent festgelegt wird. Du könntest diese Variable natürlich auch gleich nachdem sie festgelegt wurde um 1 verringern, dann müsstest Du dies in dem Fork nichtmehr berücksichtigen. Verringerst Du sie sogar um 9, erhälst Du die "genaue" Mitte des Events.
OK, in dem letzten Fork kannst Du jetzt einen Switch anschalten (oder ne Variable...) damit Du weißt, das sich der Gegner auf dem Screen befindet. In die Else Cases der Forks schaltest Du diese dann aus.


@ Schattenläufer

Es ist nunmal falsch, einfach nur a und b zu addieren. So rechnest Du eben die X und die Y Entfernung zusammen, aber Du erhälst nicht den direkten Abstand. Sieh Dir dazu auch nochmal die kleine Rechnung an, die ich unter "Edit" aufgeschrieben habe.
Du kannst es auch so machen:
Nimm ein karriertes Blatt Papier und zeichne den Helden sowie die zwei Gegner als Punkte nach den Werten ein, die ich in der Beispielrechnung angegeben habe. Nimm jetzt ein Lineal und zeichne vom Hero direkt zum ersten Gegner hin eine Gerade. Das selbe machst Du für den zweiten Gegner. Messe jetzt die Längen auf diesen Geraden von Hero zu Gegner 1 und von Hero zu Gegner 2 und vergleiche sie.
Dann wirst Du ja selbst sehen, wer jetzt wirklich näher am Hero ist.

Schattenläufer
27.02.2003, 01:32
@Gekiganger:
1. Bist du dir sicher, dass der Screen 320*240 groß ist? Ich glaub, es ist 320*200, aber vielleicht auch 20*15, wenn der RPGMaker nur die Felder zählt.

2. Nimm mal ein kariertes Blatt und male den Helden und den Gegner als Punkt in eines der Felder. Da der Held ja in Feldern läuft, bepunktest du den nicht direkten Weg, also _| , und zählst mal nach. Jetzt gehst du den direkten Weg, also / , aber du darfst nciht einfach schräg nach oben gehen, du musst zuerst eins nach links, dann eins nach oben, so wie der Held halt auch laufen würde. Und jetzt vergleich mal die beiden Zahlen. Ich habs noch nicht getan :D , aber ich wette, da kommt dasselbe raus.
Ansonsten hättest du natürlich recht mit der (wie hieß sie) *nachguck* Hypothenuse.

Gekiganger
27.02.2003, 02:14
Der Screen ist 320x240 Pixel groß, oder auch (20x15)*16, da 1 Chip gleich 16x16 Pixel groß ist.

Zu 2.:

Du willst ja nicht, das irgendjemand diese Strecke abläuft sondern nur die Entfernung, und die Schräge ist nunmal nicht a+b sondern a²+b²=c².
Und das eben nicht das selbe herauskommt, das habe ich ja mit der Rechnung unter "Edit" bewiesen.

Schattenläufer
27.02.2003, 02:17
Na gut, aber wenn du wissen willst, bei welchem Gegner du am Schnellsten bist, braucht man nunmal meine Berechnung. Ich mein, wozu braucht man denn die exakte Entfernung, noch dazu, wenns so kompliziert ist?

BTW: Das hier ist ein konstruktiver Streit, nicht dass du denkst, ich hätt was gegen dich oder so!:D Wollt ich nur klarstellen.

Gekiganger
27.02.2003, 02:36
Nun gut, das wäre eine Möglichkeit, Deine Idee einzusetzen, allerdings bist Du damit am Thema vorbeigeschossen, hier geht es darum herauszufinden, welcher Gegner dem Hero am nähsten ist und nicht, zu welchem er den kürzesten Weg laufen müsste.

BTW, das sind im Maker gerade mal 9 Zeilen Code und in einer richtigen Programmiersprache könnte man alles auf einer Zeile unterbrignen.

Schattenläufer
27.02.2003, 02:45
Ich denke mir halt, was bringts dir, wenn du weißt, dass der obere näher ist, auch wenn der andere dich zuerst angreifen kann? Stell dir vor, du wärst von 4 Monstern umzingelt. Du weißt, dass 3 von ihnen genau 2 Felder von dir weg sind, während der vierte 2 Felder weit weg und eins zur Seite ist. Wo gehst du hin? Zu dem vierten! Der ist aber, wenn man deine Rechnung abrundet (was RPGMAKER wahrscheinlich macht), genauso weit weg wie die anderen!
Oh Gott, der Vergleich suckt :D

BTW: Wenn mans erklärt, sinds halt 136 Zeilen.;)

Gekiganger
27.02.2003, 03:16
Ne, ich würde zu denen laufen, die nur zwei Felder von mir entfernt sind, das der vierte ja 2,23 Felder von mir entfernt ist.:D
Und abgerundet wird da nichts, jedenfalls wenn man nicht die genaue Entfernung wissen will, sondern nur, welcher Gegner am nähsten ist. Denn dann kommt bei den ersten 4 und beim vierten 5 heraus.

Ne also schau mal, wenn ein Gegner jetzt z.B. 9 Felder rechts vom Hero steht und 0 Felder höher oder niedriger und ein anderer Gegner 5 Felder rechts und 5 Felder über dem Hero steht, dann läuft man bis zum ersten Gegner natürlich weniger Schritte, klar. Allerdings hängt der erste Gegner ganz am Rande des Bildschirms, während der zweite subjektiv gesehen garnichtmal so weit vom Hero entfernt ist. Und das hängt nunmal mit der Psychologie des Menschen zusammen, der eben eine direkte Linie zwischen zwei Objekten zieht und nicht erst eine waagrechte und eine senkrechte.
Was würde Dir ein Spieler z.B. bei einer Zielerfassung erzählen, wenn statt dem zweiten Gegner plötzlich der erste anvisiert wird, obwohl der erste subjektiv gesehen und jetzt nicht in waagrecht/senkrechter Sichtweise gesehen eindeutig weiter entfernt ist?

Schattenläufer
27.02.2003, 18:25
Ich glaube, bevor wir uns hier in Grund und Boden konstruktiv kritisieren (:D), sollte Heaven mal sagen, wie er es überhaupt gemeint hat. Aber ich glaub, der hat diesen Thread schon vergessen :rolleyes:

Mephisto
04.03.2003, 21:29
@ Gekiganger:
Thx for help!