Posted: 4th Jun 2014 22:10
See the following thread for a detailed explanation:
http://forum.thegamecreators.com/?m=forum_view&t=211239&b=1

+ Code Snippet
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


Usage example:

+ Code Snippet
rem ---------------------------------------------------------------------------
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