Pixelgenaue Abfrage der Koordinaten von sich bewegenden Events gesucht (Javascript)

  • Hallo,


    ich bin gerade dabei angeregt durch TheGarry youtu.be/DQIqbZvCmX8?t=18407 ein kleines Script zu schreiben, um einen Laserstrahl durch eine Map zu lenken. Allerdings nicht so abgefahren wir er das im Video macht, sondern eben durch ein Script.


    Das Ganze wird per Autorun fortwährend aktualisiert und an Spiegeln umgeleitet, endet an einer Wand oder aktiviert das Ziel.


    Der Laser ist eine 1x7 Pixelgrafik und deren Skalierung wird berechnet damit die Länge stimmt. Das Script funktioniert soweit 1A mit unbeweglichen Events, da alles im 48er Raster bleibt, auch halbieren ist kein Problem.


    Nun dachte ich mir, da geht noch mehr, z.B. die Spiegel verschieben. Nun habe ich das Problem, dass ich keine pixelgenauen Koordinaten der Spiegel (die Events) habe, zumindest finde ich keine passende Getter hierfür und suche daher hier ein wenig Rat und hoffe auf Hilfe. Bisher fand ich nur _x, _realX und screenX() (für y dann auch) und diese liefern mir nur die festen Tile-Schritte, wenn sich nun die Spiegel im Laser bewegen passt natürlich nicht der umgelenkte Laserstrahl und sieht nicht vorzeigbar aus.


    Anbei Screenshots, der erste ist mit festen Spiegeln, die anderen beiden zeigen das Problem, wenn ein Spiegel bewegt wird. Man kann auch mehrere Spiegel gleichzeitig bewegen lassen, das Umlenken funktioniert nur die Länge das Laserstrahles passt eben nicht.


    Dank vorab, t31

  • Klar, bei den Events kriegst du nur die Grid-Positionen, da es sich für den Maker ja nicht lohnt dort auch noch die tatsächlichen Positionen abzuspeichern wenn sie eh nicht genutzt werden.

    Ich kenn mich da beim Aufbau des Makers nicht genug aus um die perfekte Antwort zu liefern, aber du musst an die Positionen der PIXI-Bildinstanzen kommen für dein Vorhaben.

    Nach etwas suchen habe ich sie hier gefunden:

    Code
    1. SceneManager.scene._spriteset._characterSprites

    Die Unterstriche weisen schon auf private Variablen hin, ich weiß allerdings nicht ob und wo es getter-Funktionen gibt um diese Regel nicht brechen zu müssen (Wahrscheinlich liegen irgendwo Referenzen dazu rum).

    So wie ich das sehe sind in diesem Array erst die Events geordnet nach Event-ID und dann kommen Vehicles gefolgt von Actors, wodurch du mit

    Code
    1. SceneManager.scene._spriteset._characterSprites[EventID - 1]

    an die Instanz, die dem Event zugeordnet ist, kommst und dann mit

    Code
    1. SceneManager.scene._spriteset._characterSprites[EventID - 1].x
    2. SceneManager.scene._spriteset._characterSprites[EventID - 1].y

    an die Bildschirm-Koordinaten. Aber das sollte ja für dich passen, da du die Laser-Strahlen ja auch verschieben müsstest wenn sich die Kamera bewegt.

  • Danke Grandro,


    das werde mir mal ansehen. Da werde ich erst Mal beschäftigt sein mich da durchzuwuseln.


    Derweil bin etwas weiter gekommen, das erste Ablenken am bewegten Spiegel klappt schon. Nur danach, ich muss also auch bei der Eventsuche mir was neues einfallen lassen und den Spiegel kleiner machen. Bisher mache ich das auf Tile-Basis, was statisch funktioniert, ich aber verwerfen muss:

    Code
    1. e = $gameMap.eventsXy(x, y).find(e => $dataMap.events[e._eventId].name == "Mirror")

    Wird doch etwas komplizierter als gedacht, wenn es dynamisch werden soll.