See the following thread for a detailed explanation:
http://forum.thegamecreators.com/?m=forum_view&t=211239&b=1+ Code Snippetrem ---------------------------------------------------------------------------
rem Mouse positive & negative edge detection
rem by TheComet
rem ---------------------------------------------------------------------------
rem USAGE
rem ===========
rem call initMouse() before main loop to initialise
rem call processMouse() once every loop (preferably at the beginning)
rem call positionMouse() instead of "position mouse"
rem
rem Access the mouse through the global variable "Mouse" instead of using the
rem built in commands:
rem UDT:
rem Mouse.state - Contains the current state, same as mouseclick()
rem Mouse.posEdge - Contains the positive edge bits of all buttons
rem Mouse.negEdge - Contains the negative edge bits of all buttons
rem Mouse.position - Contains the current location of the mouse:
rem Mouse.position.x, Mouse.posotion.y, Mouse.position.z
rem Mouse.relative - Contains delta values for the relative mouse position:
rem Mouse.relative.x, Mouse.relative.y, Mouse.relative.z
rem
rem Constants:
rem (X)_MOUSE_BUTTON is used for AND conjunctions for decoding the mouse bits
rem e.g. "if Mouse.pos && LEFT_MOUSE_BUTTON then print "left button positive"
rem ---------------------------------------------------------------------------
rem MOTIVATION
rem ============
rem 1) DBP's mousemove() commands can only be called once after every "sync"
rem because they update an internal state. This can cause unwanted behaviour.
rem 2) There is no smart edge detection for mice being used. Instead, people
rem are using flags and other weird things.
rem
rem This small section of code addresses these problems and wraps everything
rem to do with the mouse into a global "Mouse" variable.
rem ---------------------------------------------------------------------------
rem LINKS
rem ============
rem source: http://forum.thegamecreators.com/?m=forum_view&t=211243&b=6
rem explanation: http://forum.thegamecreators.com/?m=forum_view&t=211239&b=1
rem ---------------------------------------------------------------------------
#constant LEFT_MOUSE_BUTTON 0x01
#constant RIGHT_MOUSE_BUTTON 0x02
#constant MIDDLE_MOUSE_BUTTON 0x04
type IntVec3
x as integer
y as integer
z as integer
endtype
type MouseVT
state as integer
posEdge as integer
negEdge as integer
position as IntVec3
relative as IntVec3
endtype
function initMouse()
global Mouse as MouseVT
endfunction
function processMouse()
rem fast positive/negative edge detection
Mouse.posEdge = mouseclick() && (Mouse.state..0x07)
Mouse.negEdge = (mouseclick()..0x07) && Mouse.state
Mouse.state = mouseclick()
rem relative positions
Mouse.relative.x = mousemovex()
Mouse.relative.y = mousemovey()
Mouse.relative.z = mousemovez()
rem absolute positions
Mouse.position.x = mousex()
Mouse.position.y = mousey()
Mouse.position.z = mousez()
endfunction
function positionMouse(x, y)
Mouse.position.x = x
Mouse.position.y = y
position mouse x, y
endfunction
Usage example:
+ Code Snippetrem ---------------------------------------------------------------------------
rem Positive & Negative edge detection for mouse
rem by TheComet
rem ---------------------------------------------------------------------------
rem Copy the section at the end of this program into your own project if you
rem want to use this!
rem ---------------------------------------------------------------------------
rem setup screen
sync on
sync rate 60
backdrop on
color backdrop 0
rem important to call this
initMouse()
global mouseLeftPosClicks = 0
global mouseRightPosClicks = 0
global mouseMiddlePosClicks = 0
global mouseLeftNegClicks = 0
global mouseRightNegClicks = 0
global mouseMiddleNegClicks = 0
relativeCursorX = screen width()/2
relativeCursorY = screen height()/2
positionMouse(relativeCursorX, relativeCursorY)
rem main loop
do
rem detect positive and negative edges of mouse
processMouse()
rem user info and stats
set cursor 0, 0
print "Positive edges on left button: ";mouseLeftPosClicks
print "Positive edges on right button: ";mouseRightPosClicks
print "Positive edges on middle button: ";mouseMiddlePosClicks
print "Negative edges on left button: ";mouseLeftNegClicks
print "Negative edges on right button: ";mouseRightNegClicks
print "Negative edges on middle button: ";mouseMiddleNegClicks
rem relative mouse
inc relativeCursorX, Mouse.relative.x
inc relativecursorY, Mouse.relative.y
center text relativeCursorX, relativeCursorY-25, "relative cursor position - Z: " + str$(Mouse.relative.z)
circle relativeCursorX, relativeCursorY, 10
rem absolute mouse
print "absolute mouse X: ";Mouse.position.x
print "absolute mouse Y: ";Mouse.position.y
print "absolute mouse Z: ";Mouse.position.z
rem mouse state examples
if Mouse.state && LEFT_MOUSE_BUTTON then print "left mouse button is being held down"
if Mouse.state && RIGHT_MOUSE_BUTTON then print "right mouse button is being held down"
if Mouse.state && MIDDLE_MOUSE_BUTTON then print "middle mouse button is being held down"
rem positive mouse edge examples
if Mouse.posEdge && LEFT_MOUSE_BUTTON then inc mouseLeftPosClicks
if Mouse.posEdge && RIGHT_MOUSE_BUTTON then inc mouseRightPosClicks
if Mouse.posEdge && MIDDLE_MOUSE_BUTTON then inc mouseMiddlePosClicks
rem negative mouse edge examples
if Mouse.negEdge && LEFT_MOUSE_BUTTON then inc mouseLeftNegClicks
if Mouse.negEdge && RIGHT_MOUSE_BUTTON then inc mouseRightNegClicks
if Mouse.negEdge && MIDDLE_MOUSE_BUTTON then inc mouseMiddleNegClicks
rem refresh screen
sync
rem end of main loop
loop
rem ---------------------------------------------------------------------------
rem Mouse positive & negative edge detection
rem by TheComet
rem ---------------------------------------------------------------------------
rem USAGE
rem ===========
rem call initMouse() before main loop to initialise
rem call processMouse() once every loop (preferably at the beginning)
rem call positionMouse() instead of "position mouse"
rem
rem Access the mouse through the global variable "Mouse" instead of using the
rem built in commands:
rem UDT:
rem Mouse.state - Contains the current state, same as mouseclick()
rem Mouse.posEdge - Contains the positive edge bits of all buttons
rem Mouse.negEdge - Contains the negative edge bits of all buttons
rem Mouse.position - Contains the current location of the mouse:
rem Mouse.position.x, Mouse.posotion.y, Mouse.position.z
rem Mouse.relative - Contains delta values for the relative mouse position:
rem Mouse.relative.x, Mouse.relative.y, Mouse.relative.z
rem
rem Constants:
rem (X)_MOUSE_BUTTON is used for AND conjunctions for decoding the mouse bits
rem e.g. "if Mouse.pos && LEFT_MOUSE_BUTTON then print "left button positive"
rem ---------------------------------------------------------------------------
rem MOTIVATION
rem ============
rem 1) DBP's mousemove() commands can only be called once after every "sync"
rem because they update an internal state. This can cause unwanted behaviour.
rem 2) There is no smart edge detection for mice being used. Instead, people
rem are using flags and other weird things.
rem
rem This small section of code addresses these problems and wraps everything
rem to do with the mouse into a global "Mouse" variable.
rem ---------------------------------------------------------------------------
rem LINKS
rem ============
rem source: http://forum.thegamecreators.com/?m=forum_view&t=211243&b=6
rem explanation: http://forum.thegamecreators.com/?m=forum_view&t=211239&b=1
rem ---------------------------------------------------------------------------
#constant LEFT_MOUSE_BUTTON 0x01
#constant RIGHT_MOUSE_BUTTON 0x02
#constant MIDDLE_MOUSE_BUTTON 0x04
type IntVec3
x as integer
y as integer
z as integer
endtype
type MouseVT
state as integer
posEdge as integer
negEdge as integer
position as IntVec3
relative as IntVec3
endtype
function initMouse()
global Mouse as MouseVT
endfunction
function processMouse()
rem fast positive/negative edge detection
Mouse.posEdge = mouseclick() && (Mouse.state..0x07)
Mouse.negEdge = (mouseclick()..0x07) && Mouse.state
Mouse.state = mouseclick()
rem relative positions
Mouse.relative.x = mousemovex()
Mouse.relative.y = mousemovey()
Mouse.relative.z = mousemovez()
rem absolute positions
Mouse.position.x = mousex()
Mouse.position.y = mousey()
Mouse.position.z = mousez()
endfunction
function positionMouse(x, y)
Mouse.position.x = x
Mouse.position.y = y
position mouse x, y
endfunction