oberste (als letztes gezeichnete) instance

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

  • oberste (als letztes gezeichnete) instance

    Hallo,
    ich habe folgende Frage:
    Wie kann man die einen Verweis auf die zuletzt gezeichnete instance an einem Punkt herausfinden? Also die, die -wenn man mehrere über einander liegen hat- am weitesten oben liegt?
    Oder anderst: Wenn ich zwei Objekte habe und bei beiden ein Left-Mouse-Press Event habe, wie kann ich dann machen, dass nur das Event des oberen Objektes ausgelöst wird (evetnuell auch über das Step-Event)?
    Eine Idee wäre allen Objekten einen anderen Depth-Wert zuzuweisen und das dann abzufragen, aber das wäre ja unsinnig, da das ziemlich unflexibel ist.
    Habt ihr eine Idee?
    Viele Grüße, maxda
  • Oh ich Idiot, das hätte ich au selber finden müssen! :headtouch:
    Danke!

    Edit: Aber es wird ja die Erste Instacne angezeigt, also di mit der kleinsten ID, aber es soll ja die mit dem niedrigsten Depth-Wert bzw. wenn die gleich sind mit der größten Id. Kann man vielleicht alle Instancen, die einen Punkt berühren, herausfinden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von maxda ()

  • Ja, darauf bin ich nach einigem überlegen auch gekommen, aber erst anch dir! Hätte ich doch öfters nachgeschaut! :headtouch:
    Trotzdem Danke!
    Wobei dein Code so richtig wäre:

    GML-Quellcode

    1. globalvar _obj;
    2. global._obj = -1;
    3. with (...) if (position_meeting(xx,xy,self)) {
    4. if (global._obj == -1)
    5. {global._obj = id; continue;}
    6. if ((depth < global._obj.depth) || ((depth == global._obj.depth) && (id > global._obj.id)))
    7. {global._obj = id;}
    8. }
    9. //return global._obj;
    Alles anzeigen
  • 1. Du verwendest globalvar falsch. Wenn du das benutzt, brauchst du kein global.
    2. Entweder geht er die Objekte in aufsteigender oder absteigender Richtung durch. Also brauchst du an meinem Code eventuell nur <= statt < zu benutzen (musst du ausprobieren, ich weiß es nicht :P ).
    3. Die Idee, daraus ein Skript zu machen ist gut. Dann würde ich aber lieber var statt globalvar verwenden:

    GML-Quellcode

    1. var type,xx,yy,obj;
    2. type = argument0;
    3. xx = argument0;
    4. yy = argument1;
    5. obj = -1;
    6. with (type) if (position_meeting(xx,yy,self)) {
    7. if (obj = -1) {obj = id; continue;}
    8. if (depth < obj.depth) {obj = id;}
    9. // ^ eventuell <= statt <
    10. }
    11. return obj;
    Alles anzeigen
    Beispiel:

    GML-Quellcode

    1. instance_position_first(all,mouse_x,mouse_y);
  • In deinem Script ist aber der Fehler, das du eine Local veriable auch unter anderen Instanzen benützt! Global var habe ich sonst noch nie benutzt, deshalb hab ich davon keine Ahnung.
    Außerdem soll das Objact, das am höchsten liegt gefunden werden deshalb muss < verwendet werden. Wenn aber der Depth-Wert gleich ist muss das Objekt mit der höheren ID gefunden werden, da das später geziechnet wird.
  • var macht eine Variable im gesamten Skript verfügbar:
    (Es ist dann keine lokale Variable.)

    GML-Quellcode

    1. var foo;
    2. foo = 0;
    3. with (obj_bar) {foo = "Text";}
    4. show_message(foo);
    5. // Hier funktioniert das allerdings nicht:
    6. scr_beispiel();

    Wenn aber der Depth-Wert gleich ist muss das Objekt mit der höheren ID gefunden werden, da das später geziechnet wird.
    Ja, aber wie gesagt: Der Game Maker geht mit with die Objekte sowieso schon der Reihe nach durch. Beispiel:

    GML-Quellcode

    1. with (all) {show_message("ID: "+string(id));}
    Übrigens hab ich das grade selbst getestet, es muss <= lauten.
  • Achja, an die Reihenfolge des Durchlaufens habe ich nicht gedacht. Dann hast du natürlich Recht. Ach, wenn man es als Script verwenden will müsste es doch so aussehen:

    GML-Quellcode

    1. var type,xx,yy,obj;
    2. type = argument0.object_index;// <=========
    3. xx = argument0;
    4. yy = argument1;
    5. obj = -1;
    6. with (type) if (position_meeting(xx,yy,self)) {
    7. if (obj = -1) {obj = id; continue;}
    8. if (depth <= obj.depth) {obj = id;}
    9. }
    10. return obj;

    Denn wenn man ein Object als Argument übergibt, wird doch nur die erste instanz übergeben, oder liege ich da falsch?
  • Wieso? Lass das Skript doch so, wie es ist. Dann funktioniert es.
    Wenn du dann beim ersten Argument all angibst, geht er alle Objekte durch. Bei obj_wasweissich geht er nur alle Objekte des Types durch. Das was du meinst ist nur der Fall, wenn du es so schreibst: obj_wasweissich.variable. Dafür ist ja with da, um dieses Problem zu lösen :D
  • Ja, das Problem ist gelöst, nur dachte ich, das wenn ich einen eigen Script schreibe und einen Objecttyp übergeben will, automatisch nur die erste Instanz übergeben wird.


    Edit: Habe jetzt erfahren, dass mein vermutung falsch war. Dein SCript ist also volkommen richtig. Danke nochmal! (Mein Script war etwas längerb ^^ )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von maxda ()

  • Benutzer online 2

    2 Besucher