Ergebnis 1 bis 10 von 10

Thema: Abstand d. Hero zu best. Event abfragen

  1. #1

    Abstand d. Hero zu best. Event abfragen

    Juhu! Ein Technik-Thread von IndependentArt! Das ist bestimmt wieder ganz großes Programmierer-Kino!

    Ich schreibe grade ein Skript, um den Abstand des Heros zu ausgewählten Map-Events abzufragen.
    Das ganze sieht so aus:



    Das ganze funktioniert soweit.
    Um das Event herum gibt es ja 8 mögliche Positionen des Heros.
    Deswegen sind hier 8 abfragen, bei denen ich jeweils +1 oder -1 rechne, um herauszufinden, wo sich der Hero befindet. Man könnte das natürlich versuchen noch für einen größeren Abstand zu machen, aber das erscheint mir ungleich komplizierter. Wenn sich der Hero im Umkreis des Events befindet, wird eine Battle Animation ausgelöst.

    Meine Frage geht nun eigentlich an die Programmierer unter euch, ob das eine gute Lösung ist, oder es noch einfacher geht.

    Achja, wenn ich das für mehrere Events auf der Map machen will, würde ich dann einfach am Anfang noch eine Abfrage, welche nacheinander die einzelnen Koordinaten der Events mit dem Hero vergleicht. Dann einfach durchzählen und wenn eins betroffen ist, kommt die Ani.

  2. #2
    Du willst die Abstände 8 Felder um den Helden rum prüfen, gut.

    Code:
    // Man nimmt Position des Events minus Position des Helden.
    AbstandX = Event.X
    AbstandX - Held.X
    
    // Wenn negativ, dann Vorzeichen ändern
    if(AbstandX<0)
    {
        AbstandX *-1
    }
    
    if(AbstandX <=1)
    {
         AbstandY = Event.Y
         AbstandY - Held.Y
         if(AbstandY<0)
         {
             AbstandY*-1
         }
        if(AbstandY <=1)
        {
           // Event im direkten Umfeld des Helden
         }
    }
    Ich würde das btw. eher über die Pixelkoordiante abfragen. Die meisten Actionkampfsysteme wirken in Sachen Trefferabfragen etc. sehr buggy weil Gridkoordianten bei bewegenden Events nicht immer wiedergeben, wie es optisch wirkt.

    Geändert von Corti (14.03.2015 um 13:56 Uhr)

  3. #3
    Ersteinmal musst du definieren was für eine Art von Distanz du verwenden willst. Zum Beispiel kannst du sagen, dass deine Distanz die Summe von X- und Y-Achsen Abstand ist:
    dis = |x1 - x2| + |y1 - y2|
    Oder du kannst die Wurzel aus dem Quadrat nehmen (euklidische Distanz):
    dis = ((x1 - x2)^2 + (y1 - y2)^2)^(1/2)
    Ältere Spiele haben manchmal auch die Distanz über den größeren Abstand der X- und Y-Achse definiert:
    dis = max(|x1 - x2|, |y1 - y2|)

    Da du sehr kleine Zahlen ohne Punkt und Komma verwendest würde ich die erste Distanzformel empfehlen. Das sollte auch mit dem Maker sehr einfach zu berechnen sein, selbst mit den älteren.

  4. #4
    Zitat Zitat
    Code:
    // Man nimmt Position des Events minus Position des Helden.
    AbstandX = Event.X
    AbstandX - Held.X
    
    // Wenn negativ, dann Vorzeichen ändern
    if(AbstandX<0)
    {
        AbstandX *-1
    }
    
    if(AbstandX <=1)
    {
         AbstandY = Event.Y
         AbstandY - Held.Y
         if(AbstandY<0)
         {
             AbstandY*-1
         }
        if(AbstandY <=1)
        {
           // Event im direkten Umfeld des Helden
         }
    }

    super einfach und funktionsfähig, danke!

  5. #5
    wenn du die Abstände durch Kreis-Annäherungen herausfinden möchtest, meld dich nochmal, hab in diesem Forum irgendwann mal ne Anleitung dazu gepostet

  6. #6
    ich bin eigentlich zufrieden so wie es läuft. aber was genau meinst du damit?

  7. #7
    Wenn du den Abstand im pixelgenauen Umkreis um dein Event haben möchtest, könntest du entweder den Abstand über a²+b²=c² berechnen, aber die Wurzel ist rechnerisch nicht ganz ohne, weshalb man für Abstandsabfragen, wenn sie in großer Zahl passieren gerne Formeln nimmt, die das Ergebnis etwas ungenauer aber dafür auf eine simplere Weise berechnen.

  8. #8
    Die nächstbeste Näherung wäre, Cortis Skript dahingehend abzuwandeln, dass du die Summe der X- & Y-Abstände mit einem Wert, den du als "nah" vorgibst, vergleichst. Dann hast du als "Umkreis" zumindest eine Raute (auf der Spitze) statt eines Quadrats um das Event herum.

    @richtiger Kreis/euklid. Abstand: Und könnte man das Problem mit der Wurzel nicht in sofern umgehen, dass man einfach den zu vergleichenden Wert ebenfalls quadriert und einfach direkt mit a²+b²=c² arbeitet?
    (setzt natürlich voraus, dass wirklich nur Abstandsvergleiche durchgeführt werden und nicht zwingend der Abstand selbst noch für irgendetwas verwendet werden soll)

    EDIT: Off Topic-Frage aus Neugier und absoluter Unkenntnis: Da Corti nichts entsprechendes benutzt hat, gehe ich davon aus, dass logische Verknüpfungen oder eine (vorimplementierte) Betragsfunktion nicht verfügbar sind? Damit ließe sich das Ganze schließlich deutlich übersichtlicher darstellen.

    Geändert von Ark_X (26.03.2015 um 09:36 Uhr)

  9. #9
    Eventscript = Assembler in klickbar ;-)

  10. #10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •