Returns the PEN/MOUSE data.
Values: |0 - | true (non zero) if there is a new pen or mouse event| |1 - | PEN: last pen down x; MOUSE: last mouse button down x| |2 - | Same as 1 for y| |3 - | true if the PEN is down; MOUSE: mouse left button is pressed| |4 - | PEN: last/current x, MOUSE: the current x position only if the left mouse button is pressed (like PEN is down)| |5 - | PEN(4) for y| Mouse specific: |10 - | current mouse x pos| |11 - | current mouse y pos| |12 - | true if the left mouse button is pressed| |13 - | true if the right mouse button is pressed| |14 - | true if the middle mouse button is pressed| PEN must be enabled prior to use of this function. Pen ON|OFF
Print " Move and click the Pen or Mouse [press Esc to stop]..." Print Pen On Print Using " ####x, ####y"; ' format for x,y position While Inkey <> Chr(27) Do ' press Esc key to exit loop Locate 3, 0 ? "Pen|Mouse new event: "; Pen(0) ? ? "Pen last down|Mouse down:";: ? Usg; Pen(1), Pen(2) ? ? "Pen down|Mouse Left down: "; Pen(3) ? ? "Pen last/current|Mouse Left down:";: ? Usg; Pen(4), Pen(5) ? ? "Mouse current:";: ? Usg; Pen(10), Pen(11) ? ? "Mouse Left,Middle,Right down: ", Pen(12), Pen(14), Pen(13); Wend
DELAY say 20 ms saves CPU and battery in a loop like the above reply. It also helps after a mouse click to not over report the same click again and again. Pen(0) probably helps too. Tested on Linux 64-bit laptop…: Pen(0) does not report all events, Delay 20 does not save much CPU; Maybe on another system the situation is different. I was reporting from Windows 7 experience last year. I got a number of complaints about CPU usage and so tested performance difference using delays (WAIT with SdlBasic code). They do seem to help reduce CPU levels when I checked performance monitors on my Windows 7-64 laptop Dual Core with AMD Radeon Graphics. It’s true I am not a tech expert and there maybe a better way to wait for key press and/or mouse input. chrisws tried to show me something way back in 2015:
rem game loop example pen on quit=0 x = pen(4) y = pen(5) repeat if pen(0) then rem mouse down - get click coordinates x = pen(1) y = pen(2) logprint "pointer down: x=" + x + " y=" + y rem process more events until mouse is released mouse_down = true while mouse_down n = pen(0) x_down = pen(4) y_down = pen(5) if (x_down != -1 && y_down != -1) then x = x_down y = y_down logprint "pointer moved [down]: x=" + x + " y=" + y else mouse_down = false end if wend logprint "pointer up: x=" + x + " y=" + y else if (x != pen(4) && x != pen(5)) then x = pen(4) y = pen(5) logprint "pointer moved [up]: x=" + x + " y=" + y else rem other system event, most likely a keypress k = inkey if (k > 0) then logprint "key event: k=" + k if (len(k)=1 and asc(k)=27) or k="q" then quit=1 end if end if end if until quit pen off
when I was trying to catch both mouse down and mouse up events. The printing of numbers was overwhelming and I could not make use of the code. Maybe you or someone can. from my experience, the best way to reduce CPU usage is related directly to “what you want your program to do”. You can always design your program to behave different and more efficient after giving it a second thought; it’s very subjective. Yet there ARE some commands that allow the system to do other things while your program is waiting for some input. In SmallBASIC I still don’t know them, but in other languages (with a well written Language Reference) you got some keyword like Wait_Key, etc; Wait_Key will wait for the user to input a key, and in the meantime the system can do something else. But this must be documented by the author of the language. Whatever, reviewing our code again and again will pop up the correct logic for better performances, soon or later.