Mouseclick auf zweit Objecte

  • Allgemein

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

  • Mouseclick auf zweit Objecte

    HI,

    wenn zwei Objecte übereinander liegen und man klickt mit der Mouse auf das Obere, wird auch der Mouse Event des unteren aktiviert.
    Kann man das irgendwie verhindern? Habe schon probiert im Oberen mittels mouse_clear(mb_left); zu löschen. Nüzt aber auch nichts.

    Hat jemand einen Tip für mich?
  • Mir fällt jetzt spontan leider keine einfache Lösung dazu ein, aber prinzipiell könntest du alle Objekte die angeklickt werden in einer Liste in einem Controller-Objekt sammeln und dann testen welches davon das oberste ist.

    Beispiel:
    Funktioniert nur wenn die Objekte unterschiedliche Depths haben und das bisherige mouse_click Event kommt dabei in das User Event 0. Hab das jetzt nicht getestet und bin mir fast sicher das es auch eine bessere Lösung gibt.

    Create (objController):

    GML-Quellcode

    1. objectList = ds_list_create();

    Step Event (objController):

    GML-Quellcode

    1. var i, ins, d, temp;
    2. ins = -1;
    3. if(ds_list_size(objectList) > 0)
    4. {
    5. temp = ds_list_find_value(objectList, 0);
    6. ins = temp;
    7. d = temp.depth;
    8. i = 1;
    9. while(i < ds_list_size(objectList))
    10. {
    11. temp = ds_list_find_value(objectList, i);
    12. if(temp.depth < d)
    13. {
    14. ins = temp;
    15. }
    16. i += 1;
    17. }
    18. if(instance_exists(ins))
    19. {
    20. with(ins)
    21. {
    22. event_user(0);
    23. }
    24. }
    25. ds_list_clear(objectList);
    26. }
    Alles anzeigen

    Mouse Event (Klickbare Objekte):

    GML-Quellcode

    1. with(objController)
    2. {
    3. ds_list_add(objectList, other.id);
    4. }


    Gruß, ghost

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

  • Ich denke, dass man das vielleicht ueber verschiedene Depth-Werte machen kann. Deshalb bin ich der Meinung, dass der Ansatz von ghost auf jeden Fall in eine sinnvolle Richtung geht. Ob man das wirklich ueber eine Liste loesen muss, glaube ich aber nicht, es sei denn du weisst nie wie viele Objekte du uebereinander hast.
    GML lernen geht leicht :)
    1. http://www.gm-d.de/help/ (deutsch)
    2. gm-d.de/wbb/index.php/Thread/2270/ (Einsteiger-Referenz)
    3. docs.yoyogames.com/ (Hilfe auf Englisch von GM:S)
  • Vielen Dank, funktioniert. Was mich ein wenig irritiert ist ds_list_add(objectList, other.id); ich hätte statt other.id, self.id geschrieben. Habe mal gestestet, bei mir geben beide die gleiche ID zurück.
    Was ist der unterschied zwischen other und self und warum gibt es den other Wert bei einem Mausklick überhaupt. Ist ja kein zweites Object beteiligt?
  • self The instance which is executing the current block of code.
    other The other instance involved in a collision event, or the other instance from a with function.


    Das "other" ist im Zusammenhang mit dem Keyword "with" zu verstehen.

    GML-Quellcode

    1. with (<expression>) <statement>

    <Expression> indicates one or more instances, and for this you can use an instance id, the name of an object (which indicates all instances of this object are to run the code block) or one of the special keywords (all, self, other). <Statement> is now executed for each of the indicated instances, as if that instance is the current (self) instance.


    Die Instanz(en) die mit dem with angesprochen wird (werden) sind für die Dauer des with-Blocks also "self" und das Objekt in dem der with-Block steht "other". Im with-Block sollten demnach "other.id" und "self.id" nicht die gleichen Werte ausgeben, wenn du sie allerdings außerhalb dessen abfragst sind sie gleich, weil sie wie von dir richtig erkannt im Mouse Event wenig Sinn machen. :)

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