Wenn MouseHit irgendwie nicht hittet

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

DivineDominion

Betreff: Wenn MouseHit irgendwie nicht hittet

BeitragDi, Jan 04, 2005 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Grüße ihr Armen, die unter diesem schrecklichen und wahrlich noch nie besprochenen Problem leiden, dass im Volksmunde auch einfach als "Bug" abgetan wird:
Mousehit() funktioniert nicht so zuverlässig, wie es soll.

Ich habe da ein Workaround im Angebot.


Vorweg:
Das ist kompletter Schwachsinn!

MouseHit() funktioniert genau so, wie es geplant ist: es prüft, ob die Maus gedrückt wurde, und zwar nicht dauerthaft (das wäre Mousedown()) sondern eben nur einmal kurz bzw. nur einmal während der ganzen Druckdauer.

Das bedeutet, dass Mousehit() während eines Druckes nur einmal TRUE zurückliefert. Wenn ich 10min ohne unterbrechung gedrückt halte, kann ich also nur ein mal auf ein MouseHit() hin prüfen, denn ein zweites mal ist nicht möglich, das wäre ja schließlich ein Dauerbetrieb - MouseDown. Ja, so erklärte ich es mir zumidnest seit jeher; wie es im Hintergrund wahrlich funktioniert, kann ich nicht sagen. Klar ist jedoch, dass es eben nur ein mal reagiert, wenn man drückt. Und das zieht offensichtlich folgendes Problem mit sich:

MouseHit() lässt sich wirklich nur EIN MAL abfragen.

Wenn ich jetzt aber If-Elseif-Else-Abfragen habe in denen 10 MouseHit() fragen vorkommen, ja, was macht man denn da?

Am einfachsten ist folgende Lösung, die überall praktiziert und empfohlen wird, wenn dieses neuartige Problem - das bis dato seit etwa 4 Jahren "aktuell" und "mysteriös" ist... - auftaucht.

Status der Maus für einen Schleifendurchlauf speichern und abfragen:
Code: [AUSKLAPPEN]

Global lmb_hit = false ;Left Mouse Button
While Not Keyhit( 1 )
  cls
  lmb_hit = MouseHit( 1 )

  drawZeuch(  )
  flip
Wend


Das funktioniert eigentlich auch super.


Allerdings geht's auch anders, was vielleicht ebenfalls sehr schön und praktisch ist - vor allem, wenn man Mousehit und Mousedown gleichzeitig benötigt (hier geht der Credit an Inarie, der mir mal einen äquivalenten Code für Tastenabfragen empfahl):

Code: [AUSKLAPPEN]

;Mausstadien als Konstante definieren.
;Das hilft beim lesen, denn Wörter sind besser zu
;verstehen als Zahlen später. Auch wenn man diese
;kommentieren sollte.
Const NORMAL = 0
Const HIT = 1
Const DOWN = 2
Const UP = 3

Global LMB ;Left Mouse Button

Function mausstatus(  )
  if LMB = NORMAL
    if MouseDown( 1 ) then LMB = HIT
  elseif LMB = HIT
    if mousedown( 1 ) then LMB = DOWN else LMB = UP
  elseif LMB = DOWN
    if not mousedown( 1 ) then LMBUP
  elseif LMB = UP
    LMB = NORMAL
  endif

 ;das gleiche hier mit RMB für Right Mouse Button etc.
Endfunction


Sowas nimmt man dann auch gerne für STRG oder ALT etc., um Tastenkombinationen zu erstellen. Dafür brauchte ich das mal und es war sehr praktisch - ebenfalls zu benutzen für GUIs und ähnliches.

Achja, die Abfrage im Programm:
Code: [AUSKLAPPEN]
If LMB = HIT then hitTheMouse(  )
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

judos

BeitragFr, Jan 07, 2005 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
geht also auch etliches einfacher mit mousedown...

Code: [AUSKLAPPEN]


...grafik e.t.c.
global   timer=0
repeat

if mousehit_neu(1)=1 then
    ;mache das was du willst
endif


until keydown(1)
end


function mousehit_neu(nummer)
if mousedown(nummer)=1 then
    timer=timer+1
    if timer=1 then ret_wert=1
    if timer>1 then ret_wert=0
    else timer=0:ret_wert=0
endif
return ret_wert
end function

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group