Mauslock oder Maus fixieren

  • Mauslock oder Maus fixieren

    Hi bin gerade bei meinem Dauerprojekt ein bisschen am Bugtracking und da ist mir folgender Fehler aufgefallen:

    Wenn man sich absichtlich doof anstellt und mit einem Mausklick auf einen Button das Press-Event auslöst und dann das Release-Event verhindert, indem man gedrückt hält und die Maus verschiebt kann es zu unangenehmen Fehlern führen, da die meisten Button im Spiel halt auf Shortclicks ausgelegt sind, bzw. das Press-Event und das Release-Event beide auf dem gleichen Button stattfinden müssen (weil sie zusammen gehören), damit alles einwandfrei funktioniert.
    Natürlich kann man als Spieler entweder darauf aufpassen, dass soetwas nicht passiert oder man weiß es garnicht und es fällt trotz tausender Klicks nicht ein einziges Mal auf.. aber ich bin halt der Meinung, dass ich als Programmierer dafür zuständig bin solche Fehler bereits im Voraus auszumerzen.

    Daher meine Frage: Kann ich in dieser hundertstel Sekunde zwischen dem drücken des Mausknopfs und dem loslassen des Mausknopfs irgendwie verhindern das ein destruktiver Spieler die Maus weg bewegt und so absichtlich das Release-Event verhindert (Ohne das die guten Spieler davon beeinträchtigt werden, weil z.B. ihre Maus hakt)?
  • Wenn ich dich richtig verstehe, ist die von dir verwendete Methode auch eher für Anfänger gedacht. Wenn du dich lobenswerterweise dafür zuständig fühlst, solche Probleme von vornherein gar nicht erst entstehen zu lassen, verwende doch einfach folgendes:
    mouse_check_button(numb) Returns whether the mouse button is currently down (use as values mb_none, mb_left, mb_middle, or mb_right).
    mouse_check_button_pressed(numb) Returns whether the mouse button was pressed since the last step.
    mouse_check_button_released(numb) Returns whether the mouse button was released since the last step.

    Natürlich muss das je nach Bedarf mit weiteren Abfragen kombiniert werden und ist somit etwas komplexer, aber es ist zuverlässig. In meinen Projekten bspw. verfügen die meisten Objekte nur über 2 Events (Create und Step, max. noch Alarme), Draw Event mal ausgeschlossen. Alles andere ist zu unübersichtlich und - wie du hier selbst bemerkt hast - nicht unbedingt flexibel.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Danke für die schnelle Antwort. Das Event in Code umzuwandeln löst mein Problem nicht wirklich oder? Ich meine wenn ich es so mache und das mit anderen Abfragen kombiniere ist es letztlich egal ob ich das mit den Events oder den Befehlszeilen machen. Ich versuche möglichst wenig im Step-Event zu machen da es sich sowieso um ein Rundenbasiertes Spiel handelt, wenn der Spieler also nicht aktiv irgendwas macht, braucht das Spiel auch nicht ständig zu prüfen ob nicht doch etwas passiert, das ist in der Tat weniger Anspruchsvoll und eher was für Anfänger als für Profis nur bin ich halt weniger der schnell gelangweilte Programmierer als viel mehr der engagierte Anfänger-Noob der lieber 500 Wenn/Dann-Funktionen baut als eine Schleife oder Arrays zu verwenden.
    Mag sein das der Mikrochip vomDe Lorean DMC-12 aus zurück in die Zukunft viel viel kleiner und besser funktioniert als das riesen Ding mit Drähten und Röhren aus den 60er Jahren - aber er läuft auch damit. ;)
  • Ich hab das Gefühl, dass ich deinen ersten Post nicht ganz verstanden hab. Kannst du das Problem nochmal konkret schildern?
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ok ich versuchs nochmal deutlicher. In meinem Spiel gibt es mehrere Objekte/Knöpfe/Buttons welche man mit der Maus anklicken kann um unterschiedliche Vorgänge auszulösen, z.B. nächster Spieler, Inventar öffnen, Statusleiste anzeigen etc... genau die gleichen Aktionen lassen sich auch mit entsprechenden Tasten auf der Tastatur ausführen. Nehmen wir jetzt zum Beispiel die Taste "I" fürs Inventar. Mit meinem bisherigen Code ist es nötig einige Befehle auszuführen wenn ich die Taste (auf der Tastatur) runterdrücke und einige Sachen wenn ich sie wieder loslasse. Bei einem Tastendruck ist es normal den Finger irgendwann wieder von der Taste zu nehmen und es ist auch nicht möglich das Release-Event bei einem Tastendruck zu unterbinden. - Normalerweise macht das auch kein Mensch von sich aus bei einem druck auf die Maustaste... man klickt und es entsteht ein Mouse-press und ein mouse-release-event auf dem gleichen Objekt/Knopf/Button im Gegensatz zum Tastendruck lässt sich bei der Maus aber verhindern, dass das Release-Event eintritt, weil ich ja die Maustaste runterdrücken kann (press-event) dann aber die Maus vom Objekt wegbewegen kann ohne das, das Release-Event ausgeführt wird. Natürlich könnte ich das mit global.mouse-release lösen aber das hieße sehr viele Sachen noch einmal komplett umstrukturieren die eigentlich wunderbar funktionieren.
    Deshalb möchte ich halt verhindern, dass die Maus vom Objekt wegbewegt wird, wenn ich gerade ein mouse-press-event am laufen habe.
    Puh is das viel... Ich hoffe ich konnte trotzdem den schmalen Grad zwischen: Ich weiß immer noch nicht was er
    will - und - der will uns für Dumm verkaufen - wahren.
  • Ok, um den Mauscursor unbeweglich zu machen, gibt's folgende Möglichkeiten:
    display_mouse_get_x() Returns the x-coordinate of the mouse on the display.
    display_mouse_get_y() Returns the y-coordinate of the mouse on the display.
    display_mouse_set(x,y) Sets the position of the mouse on the display to the indicated values.

    window_mouse_get_x() Returns the x-coordinate of the mouse in the window.
    window_mouse_get_y() Returns the y-coordinate of the mouse in the window.
    window_mouse_set(x,y) Sets the position of the mouse in the window to the indicated values.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ich hab jetzt alle Befehle aus dem Handbuch über den Abschnitt die Maus ausprobiert außer
    (mouse_x* X-Koordinate der
    Maus im "room" (Raum). Kann nicht geändert werden.
    mouse_y* Y-Koordinate der
    Maus im "room" (Raum). Kann nicht geändert werden.)
    und auch kombiniert, aber egal wie ich es mache, es ist dem Spieler noch möglich seine Maus zu bewegen, nachdem ich sie in der Mitte des
    Objektes platziert habe.
    Lässt sich da mit dem Befehl oben vielleicht was machen? Kann ich alle "Bewegungen" (Veränderungen der x,y Koordinaten durch Verschieben) der Maus für einen kurzen Moment abschalten und erst nach loslassen der linken Maustaste wieder einschalten?
  • versuchs mal so:

    GML-Quellcode

    1. //mouse pressed
    2. X = mouse_x;
    3. Y = mouse_y;
    4. mouse_pressed = true;

    GML-Quellcode

    1. //mouse relased
    2. mouse_pressed = false;

    GML-Quellcode

    1. //step
    2. if mouse_pressed window_mouse_set(X,Y);


    Das müsste die Maus mehr oder weniger einfrieren, wenn der Mousebutton gedrückt ist. Hoff ich konnte dir helfen ;)
  • Sehr schön danke, das ist genau das, was ich haben wollte... wer sich wirklich Mühe gibt kann es immer noch schaffen Mist zu bauen, aber dass lässt sich wohl nicht verhindern.
    Ich hab das jetzt ins glob.leftpress bzw. glob.leftrelease gesetzt oder geht das auch mit den Normalen?
  • Irgendwas hast du falsch gemacht. Ich nutze grundsätzlich die oben genannten Befehle, um die Maus einzuschränken. Dafür sind sie auch da. ^^
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Nein, Jokohono...
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Natürlich nun bin ich wieder schuld ^^
    Wenn ich deinen Befehl genommen habe, hat er mir nur den Mauszeiger im ersten Moment des Klickens auf das Objekt gezogen, nur lies sich der Dauerdruck eben fortsetzen und danach das Release-Event außerhalb des Objektes vollenden.
  • Naja, der Befehl muss dann schon in jedem Step ausgeführt werden, solange die Maus nicht bewegt werden soll. Aber das Problem ist ja bereits gelöst. :)
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ich habs eigentlich ins Step-Event geklatscht und damit ausprobiert... aber egal du hast Recht meine Frage ist beantwortet und der Thread gelöst.
    Nochmal vielen Dank - an Beide :thumbsup: