PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Entfernungen berechnen



haebman
20.04.2006, 11:49
Also erstmal würde ich ja Bilder posten aber irgendwie gibt es grad Probleme mit dem uploaden... nuja muss es halt so gehen.

Also :

In meinem Kampfsystem kämpft man direkt auf dem normalen Screen. Dementsprechend sollen die Kampfteilnehmer auch hin und her laufen.
Das Ganze ist aufgebaut wie ein Grandia-KS, komplett mit Cancel moves und etc. das Funktioniert auch soweit alles bis auf eines:

Wählt man einen Angriff soll der charakter zum Gegner rennen. Dazu hat er einen bestimmten Movement-Wert, von 1-10. D.h. er kann Maximal 10 Felder zurücklegen oder minimal 1. Das Gleiche gilt für die Gegner.
Dabei sind die Figuren ja in Bewegung und die Positionen ändern sich ständig!
Und am allerschlimmsten muss man ja noch die Entfernung mit einbeziehen die der chara zurücklegen DARF.

Ich hab gedacht das muss man halt in X/Y-Position ausdrücken.
Dann nimmt man die Variable zb. Gegner 2 -X und zieht davon die Variable Held - X ab.
Diesen Wert vergleicht man mit Movement Held (auch eine Variable) und dementsprechend macht man dann einen Coniditional Branch/Fork/Whatever...

Das Problem stellt jetzt das Moveevent da. Das ist ja immer anders. Man kann ja wohl schlecht für jede Situation (Bedenkt: Man muss ja X und Y einbeziehen, der chara kann in alle vier richtungen laufen) etwas skripten...

Mit dem reinen x-Wert funktioniert meine Methode sogar:D Der Chara erkennt zumindest ob er nach rechts oder links laufen muss:D

Naja kann mir einer von den Tech-Profis erklären wie sowas besser gehen könnte oder gar nicht möglich ist...
oder ob es irgendwo ein Skript für sowas gibt? Hab noch keins gefunden...

Danke im Voraus :)

Edit: Hat doch geklappt mit den Bildern

Code 1 (http://usera.imagecave.com/haeb/Code1.bmp.jpg)

Der erste Teil vom Code, es war spät gestern^^
Den Gegner hat man eine Seite vorher schon gewählt. Ich hab jetzt bloss den Code für Gegner 1 (bzw Variable Gegner 2 -X ) gemacht.

Code 2 (http://usera.imagecave.com/haeb/Code2.bmp.jpg)

Der zweite Teil

Spielbildschirme (http://usera.imagecave.com/haeb/Code3.bmp.jpg)

So soll es (quasi) aussehen. Der rechts mit dem Schwert soll da hinrennen wo der Cursor (die Hand) gerade ist. (sobald der blaue Pfeil auf der Leiste ganz rechts ist).
Ist alles noch Probestadium spart euch Mappingkritiken :D

Dhan
20.04.2006, 13:01
Ich versteh nicht ganz, wo das Problem liegt

Entweder du machst es so, dass man sich nur kachelweise bewegt, dann ist der Abtand im Prinzip |XZiel - XHeld| + |YZiel - YHeld|
Oder du machst einen realen Abstand, dann ist es sqrt ( (|SceneXZiel - SceneXHeld|)² + (|SceneYZiel - SceneYHeld|)²)

Wenn du den Helden als Event hast und den Zeiger auf dem Ziel als Helden mit veränderter GFX, brauchst du nur die Koords/Scenes einzulesen, das Script anzuwenden und nachzuprüfen, ob es unter einem bestimmten Wert (wie eben 10) liegt, wenn nein, passiert halt nix oder es kommt nen Warnton oder oder

(für sqrt müsstest du natürlich nen Script basteln)

Der Drake
20.04.2006, 14:14
Entweder du machst es so, dass man sich nur kachelweise bewegt, dann ist der Abtand im Prinzip |XZiel - XHeld| + |YZiel - YHeld|
Das ist schlichtweg falsch, da fällt der Fehler vielleicht manchmal nicht so auf, aber er ist da und sobald die Zahlen etwas größer werden und die Seiten ungefähr gleich sind wird er sich bemerkbar machen...


Oder du machst einen realen Abstand, dann ist es sqrt ( (|SceneXZiel - SceneXHeld|)² + (|SceneYZiel - SceneYHeld|)²)
Und wie du sicher weißt, beherscht der maker keine Quadratwurzeln. Wenn du also deine Performance behalten willst, würde ich dir raten erst garnicht mit sowas anzufangen und den Wert einfach mit dem Quadrat der Entfernung zu vergleichen:
a² + b² = c²

Es gibt auch eine Näherung, die zwar ebenfalls einen Fehler verursacht, der allerdings normalerweise nicht auffällt:
|längereSeite| + |kürzereSeite|/2
eine Begründung bitte in Graphics Gems I nachschlagen, oder einfach ein Dreieck anschauen. :P

Dhan
20.04.2006, 19:00
Das ist schlichtweg falsch, da fällt der Fehler vielleicht manchmal nicht so auf, aber er ist da und sobald die Zahlen etwas größer werden und die Seiten ungefähr gleich sind wird er sich bemerkbar machen...

Nö isses absolut net.
Es ist nur ganz einfach keine echte Entfernung sondern eine Entfernung in horizontalen und vertikalen Schritten, was ich aber auch geschrieben habe und was gefordert war.


Und wie du sicher weißt, beherscht der maker keine Quadratwurzeln.


(für sqrt müsstest du natürlich nen Script basteln)
Lesen bildet.

Und was heißt hier Performance, nen sqrt-Script schluckt praktisch nix.

DR_Zeph
20.04.2006, 19:20
das ganze sollte eigentlich so mehr oder weniger funktionieren...

http://img71.imageshack.us/img71/5524/coderingdeppen4ky.png

Der Drake
20.04.2006, 19:37
Nö isses absolut net.
Es ist nur ganz einfach keine echte Entfernung sondern eine Entfernung in horizontalen und vertikalen Schritten, was ich aber auch geschrieben habe und was gefordert war.
das ist aber nicht der kürzeste Weg zwischen Zwei Punkten, und wie gesagt wenn das Ziel dann ungefähr x + y Schritte entfernt ist, mit x = y (oder ungefähr) wird die Route alles andere als schön...


Lesen bildet.

Und was heißt hier Performance, nen sqrt-Script schluckt praktisch nix.
Ich hab deinen Post gelesen, wie stehts mit dir?
Der Punkt war mehr, das es sehr viel schneller geht. Dierekt eine Quadratwurzel Funktion zu implementieren klingt für mich ziemlich nach dem unter Programmieren altbekannten Holzhammer, findest du nicht?

Dhan
20.04.2006, 20:57
das ist aber nicht der kürzeste Weg zwischen Zwei Punkten, und wie gesagt wenn das Ziel dann ungefähr x + y Schritte entfernt ist, mit x = y (oder ungefähr) wird die Route alles andere als schön...
Doch, wenn man sich nur vertikal und horizontal bewegen kann, ist das der kürzeste Weg.


Ich hab deinen Post gelesen, wie stehts mit dir?
Der Punkt war mehr, das es sehr viel schneller geht. Dierekt eine Quadratwurzel Funktion zu implementieren klingt für mich ziemlich nach dem unter Programmieren altbekannten Holzhammer, findest du nicht?
Und was meinst du, wie meine sqrt-Funktion aussähe?
Da es keine Fließzahlen hat, wäre es mehr oder weniger lediglich eine Funktion, die, mehr oder minder gezielt schaut, welche Zahl mal sich selbst am nahsten an der eingegeben Zahl dran ist. Und das kostet praktisch keine Performance.

übelster Held
20.04.2006, 21:34
hm... warscheinlich steh ich grad auf nen schlauch...
mit der methode von zeph + dhan
also x differenz + y differenz= kürzeste strecke bei kästchenbewegung
geh ich mit...

aber was sagt denn die methode a² + b² = c² (oder eine umstellung)
über das erreichen in 10 schritten aus???

mfg
üH

Der Drake
20.04.2006, 21:35
Und was meinst du, wie meine sqrt-Funktion aussähe?
Da es keine Fließzahlen hat, wäre es mehr oder weniger lediglich eine Funktion, die, mehr oder minder gezielt schaut, welche Zahl mal sich selbst am nahsten an der eingegeben Zahl dran ist. Und das kostet praktisch keine Performance.
Nun, Rechnen wir mal:
Der Maker unterstützt Integer in dem Intervall [0, 999.999], in diesem Intervall gibt es bei korrekter Rundung 1000 verschiedene mögliche Wurzeln. Schnellstes Verfahren zur Durchsuchung einer solchen Struktur ist die Binäre Suche, mit einer Laufzeit von O(log(n)), in unserem Falle ~7 Abfragen pro Wurzel.
Der Programmiertechnische Aufwand eines solchen Verfahrens lässt ein weniger optimales Suchverfahren wahrscheinlicher Erscheinen, womöglich, bzw. höchstwahrscheinlich, eines mit linearer Laufzeit.

Jede richtige Berechnung einer Quadratwurzel bräuchte noch sehr viel mehr Performance. Wenn du hingegen dierekt mit dem Quadrat vergleichst kostet dich das eine einzelne Multiplikation... und wir reden besser nicht vom gesparten Aufwand auf deiner Seite, oder? =P

Nein, es war nicht meine Idee so technisch zu sein.


aber was sagt denn die methode a² + b² = c² (oder eine umstellung)
über das erreichen in 10 schritten aus???
falls du auch diagonale bewegungen einbeziehen willst ist es normalerweise besser die reale Entfernung zu kennen, bzw. musst du sie kennen in den meisten path finding algorhytmen. Etc.

DR_Zeph
20.04.2006, 23:21
Unser guter Dhan hat niemals von einer Funktion geredet, die darüber hinausgeht, die "diagonale" entfernung zu berechnen, lediglich die Bewegung in Tiles, was mehr oder weniger sofern ich mich entsinne auch nur gefragt war. Nya, das ganze ist eh mehr oder weniger Schwachsinn was wir hier machen, da die eigentliche Strecke die der Char zurücklegt, von dem Pathfindalgorithmus abhängt, den der Threadhersteller benutzt, und in diesem ist es eigentlich eine leichtigkeit eine Schrittzählung einzubaun...

haebman
23.04.2006, 17:09
um sorry hab den thread ja ganz vergessen...

Danke für eure antworten aber mein Problem sind die Moveevents, das raf ich net wie ich das machen soll.

Entfernung brauchts ja bloss weil sich im kampf alle zufällig bewegen.(Also Gegner pickt sich per "random" ein Ziel und der spieler rennt ja auch zum nächsten Gegner usw.)
wenn ich also jetzt X = 5 und Y= 1 hab bräucht ich ja das Move event 5 rechts eins nach oben, aber bei X = 3 und Y = 8 schauts ja wieder anders aus...

Wie mach ich also das der chara da hin rennt (mit dem vorgegeben Mov-Wert für X und Y zusammen)?

Dhan
23.04.2006, 18:28
Böh dein Problem is echt seltsam formuliert O.o

Brauchst du jetzt ein Pathfindig-Skript in das man ein Ziel eingibt und das dann automatisch da hin läuft oder ein Skript, um zufällig ein Ziel innerhalb eines bestimmten Rahmens (in dem Fall eine bestimme Schrittzahl zum Ursprungsort) auszuwählen oder was?
Was genau soll das Skript können?

@Drake: Wenn man das Skript mit ganzen Zahlen als Ergebnis annähernd macht, ist das in ner Hundertstelsekunde problemlos durchgerechnet, von wegen Performance, wir ham hier lediglich eine kleine Berechnung. In nem riesigen komplexen Skript wo hunderte solcher Dinger gleichzeitig berechnet würden, sähs anders aus, klar, aber in nem kleinen Makerprojekt pffff

haebman
23.04.2006, 20:02
Was heist komisch formuliert he, is halt schwer zu erklären mensch

Naja das Skript soll können das , wenn der Spieler eine Attacke auswählt bei der die Figur zum Gegner laufen soll ( die 10 Felder beispielsweise) , das auch macht.
Die Figur bleibt dann aber an diesem erreichten Punkt stehen, egal ob der Gegner erreicht ist oder nicht! Das macht es ja schwierig. Die Koordinaten bleiben so ja nicht gleich, also kann man kein allgemeingültiges Moveevent machen! So hätt ich das ja auch noch hinbekommen irgendwann^^
Und Setup Event Place is zwar möglich sieht aber doch doof aus wenn der auf einmal da drüben steht^^
Für Gegner gillt daselbe,die wählen ihr Ziel halt zufällig (is ja auch kein Problem), sollen aber auch diese Beschränkungen haben mit der maximalen Reichweite.

Kennst du Grandia? So ähnlich wie die da im Kampf rumrennen hat ich das im Kopf.

Kurz gesagt ist mein Problem wie man das - Moveevent - machen soll wenn es jedesmal anders ist!

Dhan
23.04.2006, 20:18
Du machst ein Pathfinding-Skript (wenns schön aussehen soll, sorg dafür, dass durch einen Switch abwechselnd vertikal und horiziontal gelaufen wird wenns schräg liegt) und darin wird nach jedem Schritt eine Variable, die anfangs 10 beträgt, um ein herabgesetzt und das Skript beendet, wenn sie 0 erreicht, das Pathfinding Skript versucht dabei, zum tatsächlichen Ziel zu kommen.

wo is das Problem.