Nächstes Objekt rechts von mir

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Nächstes Objekt rechts von mir

    Hallo Leute,

    ich würde gerne "Objekt A" nach der nächsten Instanz von "Objekt B" suchen lassen, aber NUR nach denjenigen "Objekten B" die sich rechts von "Objekt A" befinden.

    Wie mach ich das? Irgendwas mit instance_nearest und x<other.x?

    Vielen Dank im Voraus!

    Gruß,
    Pascal
  • @Larsi
    Instance-Nearest ist aber nicht richtungsabhängig. D.h. wenn eine Instanz links näher dran ist,d ann würde sich das Objekt auf die zubewegen und nicht auf die nächste rechts.

    Okey, ich helf mal mit einem Code. Mit with-Schleife geht's noch einfacher ist mir grad eingefallen.

    GML-Quellcode

    1. var min_d, ne_id; min_d = 999999; ne_id = 0;
    2. with(obj_irgendwo) // führt folgenden Code für alle Instanzen von obj_irgendwo aus. Lokale Variable die mit var definiert wurden, bleiben erhalten!
    3. {
    4. if x > other.x // Wenn die Instanz rechts ist ("other" bezieht sich immer auf die Instanz in der das with-Statement ausgeführt wurde!
    5. if (x-other.x) < min_d (wenn die Distanz kleienr ist als die bisher kleinste distanz
    6. {
    7. ne_id = id; // setze die ID auf diese Variable
    8. min_d = (x-other.x); // setze die neue Distanz als bisher kleinste
    9. }
    10. }
    11. if ne_id > 0 // wenn überhaupt eine Instanz rechts gefunden wurde
    12. move_towards_point(ne_id.x,ne_id.y,speed); // bewege darauf zu
    Alles anzeigen
    Hoffe das funktioniert :)

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • DragonGamer schrieb:


    @Larsi
    Instance-Nearest ist aber nicht richtungsabhängig. D.h. wenn eine Instanz links näher dran ist,d ann würde sich das Objekt auf die zubewegen und nicht auf die nächste rechts.

    Okey, ich helf mal mit einem Code. Mit with-Schleife geht's noch einfacher ist mir grad eingefallen.

    var min_d, ne_id; min_d = 999999; ne_id = 0;
    with(obj_irgendwo) // führt folgenden Code für alle Instanzen von obj_irgendwo aus. Lokale Variable die mit var definiert wurden, bleiben erhalten!
    {
    if x > other.x // Wenn die Instanz rechts ist ("other" bezieht sich immer auf die Instanz in der das with-Statement ausgeführt wurde!
    if (x-other.x) < min_d (wenn die Distanz kleienr ist als die bisher kleinste distanz
    {
    ne_id = id; // setze die ID auf diese Variable
    min_d = (x-other.x); // setze die neue Distanz als bisher kleinste
    }

    }

    if ne_id > 0 // wenn überhaupt eine Instanz rechts gefunden wurde
    move_towards_point(ne_id.x,ne_id.y,speed); // bewege darauf zu




    Hoffe das funktioniert



    Hey super, das funktioniert! :thumbsup:

    Aber leider hab ich noch nicht ganz verstanden wie der Code funktioniert... Kannst Du das nochmal für DOOFE erklären? ;)

    Was hat es mit den variabeln "min_d" und "ne_id" auf sich? Warum stehen die auf "999999" und "0"?

    Und was bedeutet "id"?

    Vielen Dank schonmal für Deine Hilfe!
  • Okey :)
    Die variable id die jede Instanz im Game maker besitzt, enthält eine Zahl größer als 100000. Diese id ist für jede Instanz verschieden. Wenn du im Roomeditor mit der Maus über einer Instanz gehst, siehst du irgendwo unten rechts diese Nummer angezeigt.
    Da der GM objektorientiert arbeitet kann man mit Hifle dieser ID eine Instanz ansprechen indem man die Zahl in eine Variable packt und dann z.B. "ne_id.x" schreibt. Dies gibt genau den x-Wert dieser Instanz zurück.
    Schreibt man dagegen obj_irgendwo.x, dann bezieht sich das nur auf die erste Instanz des Objekt-Typs "obj_irgendwo"!
    Kurz gesagt: Man kann damit Instanzen unterscheiden.

    Nun zum Code: Das With-Statement ist im grunde eine Schleife. Wie bereits gesagt führt sie den Code in der geschweiften Klammer für alle Instanzen des Objekttyps obj_irgendwo aus.
    min_d ist die bisher kürzeste Distanz zu einer Instanz. ne_id dagegen enthält die ID dieser Instanz die am nächsten ist.
    Beim durchlaufen der Schleife wird zunächst der x-Wer der momentanen Instanz mit der aufrufenden Instanz (other) verglichen so dass nur Instanzen rechts davon berücksichtigt werden.
    Als nächstes wird der genaue Abstand zu der Instanz bestimmt und wenn diese Distanz kleiner ist als die bisher kleinste Distanz, dann bedeutet das ja dass die momentane Instanz näher dran ist. Also wird der kleinste Abstand (min_d) neu gesetzt und gleichzeitig die ID der variablen ne_id zugeordnet damit man sie benutzen kann.

    Somit enthält am ende die Variable ne_id die ID derjenigen Instanz die am nächsten ist. Bei ne_id ist der Startwert 0 damit unterschieden werden kann ob eine Instanz gefunden wurde oder nicht (da die ID einer Instanz immer > 0 ist).
    Der Startwert von min_d muss theoretsich eine unendlich große Zahl sein da ja nur Instanzen berücksichtigt werden die näher dran sind.

    Hoffe diese Erklärung hilft etwas..

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • DragonGamer schrieb:


    Okey
    Die variable id die jede Instanz im Game maker besitzt, enthält eine Zahl größer als 100000. Diese id ist für jede Instanz verschieden. Wenn du im Roomeditor mit der Maus über einer Instanz gehst, siehst du irgendwo unten rechts diese Nummer angezeigt.
    Da der GM objektorientiert arbeitet kann man mit Hifle dieser ID eine Instanz ansprechen indem man die Zahl in eine Variable packt und dann z.B. "ne_id.x" schreibt. Dies gibt genau den x-Wert dieser Instanz zurück.
    Schreibt man dagegen obj_irgendwo.x, dann bezieht sich das nur auf die erste Instanz des Objekt-Typs "obj_irgendwo"!
    Kurz gesagt: Man kann damit Instanzen unterscheiden.

    Nun zum Code: Das With-Statement ist im grunde eine Schleife. Wie bereits gesagt führt sie den Code in der geschweiften Klammer für alle Instanzen des Objekttyps obj_irgendwo aus.
    min_d ist die bisher kürzeste Distanz zu einer Instanz. ne_id dagegen enthält die ID dieser Instanz die am nächsten ist.
    Beim durchlaufen der Schleife wird zunächst der x-Wer der momentanen Instanz mit der aufrufenden Instanz (other) verglichen so dass nur Instanzen rechts davon berücksichtigt werden.
    Als nächstes wird der genaue Abstand zu der Instanz bestimmt und wenn diese Distanz kleiner ist als die bisher kleinste Distanz, dann bedeutet das ja dass die momentane Instanz näher dran ist. Also wird der kleinste Abstand (min_d) neu gesetzt und gleichzeitig die ID der variablen ne_id zugeordnet damit man sie benutzen kann.

    Somit enthält am ende die Variable ne_id die ID derjenigen Instanz die am nächsten ist. Bei ne_id ist der Startwert 0 damit unterschieden werden kann ob eine Instanz gefunden wurde oder nicht (da die ID einer Instanz immer > 0 ist).
    Der Startwert von min_d muss theoretsich eine unendlich große Zahl sein da ja nur Instanzen berücksichtigt werden die näher dran sind.

    Hoffe diese Erklärung hilft etwas..



    Danke jetzt hab ich es auch verstanden! :thumbup:


    Nur eine kleine Frage habe ich noch:

    was hat es damit auf sich:

    GML-Quellcode

    1. var min_d, ne_id;


    Muss man das schreiben bevor man eine variable erstellt? Hab ich bis jetzt nie gemacht...


    Vielen Dank nochmal für Deine Mühe! :thumbsup:
  • Oh das definiert script-interne Variablen (lokale variablen). Diese haben zwei Unterschiede im Vergleich zu normalen oder globalen variablen:
    1. Sie existieren nur innerhalb dieses Skriptes/Codestückes und werden hinterher verworfen (d.h. wird das Skript nochmal ausgeführt, existieren sie ebenfalls nicht mehr). Damit kann man Speicher spaaren und man sollte das darum immer machen wann immer es geht.
    2. und das ist wichtig in dem Code oben: Sie existieren immer in dem Skript.
    Wie ich ja beschrieben habe, führt das with-Statement den COde für eine andere Instanz aus. D.h. würde man da schreiben x+= 10 dann würden sich alle obj_irgendwo-Instanzen um 10 Pixel verschieben, nicht aber die Instanz in der dieser Code steht.
    Entsprechend hat man innerhalbd es Statements auch nur zugriff auf die Variablen der Instanz. Zusätztlich sind jedoch auch die im SKript mit var definierten variablen verfügbar! D.h. ohne var würde der Code garnicht funktionieren da min_d und ne_id als normale Variablen der Instanzen verstanden würden.

    Uff.. solche Tricks sind schwer zu erklären... Ich finde sowas lernt man am besten durch Probieren! :) Hab GML auch so gelernt..

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • DragonGamer schrieb:


    Oh das definiert script-interne Variablen (lokale variablen). Diese haben zwei Unterschiede im Vergleich zu normalen oder globalen variablen:
    1. Sie existieren nur innerhalb dieses Skriptes/Codestückes und werden hinterher verworfen (d.h. wird das Skript nochmal ausgeführt, existieren sie ebenfalls nicht mehr). Damit kann man Speicher spaaren und man sollte das darum immer machen wann immer es geht.
    2. und das ist wichtig in dem Code oben: Sie existieren immer in dem Skript.
    Wie ich ja beschrieben habe, führt das with-Statement den COde für eine andere Instanz aus. D.h. würde man da schreiben x+= 10 dann würden sich alle obj_irgendwo-Instanzen um 10 Pixel verschieben, nicht aber die Instanz in der dieser Code steht.
    Entsprechend hat man innerhalbd es Statements auch nur zugriff auf die Variablen der Instanz. Zusätztlich sind jedoch auch die im SKript mit var definierten variablen verfügbar! D.h. ohne var würde der Code garnicht funktionieren da min_d und ne_id als normale Variablen der Instanzen verstanden würden.

    Uff.. solche Tricks sind schwer zu erklären... Ich finde sowas lernt man am besten durch Probieren! Hab GML auch so gelernt..


    Ok, Danke! :thumbup:
  • DragonGamer schrieb:

    Uff.. solche Tricks sind schwer zu erklären... Ich finde sowas lernt man am besten durch Probieren! Hab GML auch so gelernt..

    fasse deine posts hier zusammen und du hast ein tut geschrieben - na ja fast, aber in jedem falle gute arbeit, auch für mich sehr hilfreich :) OC
    EDIT: hab vergessen danke zu sagen :whistling:
    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
    (Albert Einstein)
  • Benutzer online 4

    4 Besucher