and this is pete's game with MY routine: to prove it's fast enough for prime time. it took a while to write this program and get it debugged. in the process, i eliminated some unnecessary variables and made this thing pretty efficient. if you take a look at the code, you'll find that it does a nice job of g]etting things done, even with the extraneous double-button code. now available as an individual sub. this sub allows detection of left or right mouse button based drag! my pain, your gain! please download the unmodified version above as this one had a few mods to run pete's code.
'* CGMouseSub.bi
const MouseLB%=1
const MouseRb%=2
const Mousebb%=3
const CursorActX=1
const CursorActY=2
const DragLmb%=1
const DragRmb%=2
const DragBoth%=3
TYPE Mouserecord
LmbPressed AS DOUBLE
RmbPressed AS DOUBLE
BothPressed AS DOUBLE
lmbThreshhold AS DOUBLE
rmbthreshhold AS DOUBLE
boththreshhold AS DOUBLE
lmbdblclickthreshhold AS DOUBLE ' \
rmbdblclickthreshhold AS DOUBLE ' * time-delay to detect double-mouse clicks
bothdblclickthreshhold AS DOUBLE '/
countrmbsingle AS LONG ' \
countlmbsingle AS LONG ' * counts number of times double-clicks are detected
countbothsingle AS LONG '/
countlmbdouble AS LONG
countrmbdouble AS LONG
countbothdouble AS LONG
dbllmb AS INTEGER ' \
dblrmb AS INTEGER ' * whether press type is left, right or (left+right) simultaneous
dblboth AS INTEGER '/
MouseX AS INTEGER '* current mouse (x,y) coords
MouseY AS INTEGER
ActionX AS INTEGER '* type of mouse movement x or y direction
ActionY AS INTEGER
MouseStateLmb AS INTEGER '* current state of the left mouse button
MouseStateRmb AS INTEGER '* current state of the right mouse button
MouseStateBoth AS INTEGER '* current state of the (left+right) simultaneous mouse button: not yet implemented
MouseDragLmbXStart AS INTEGER '* starting (x,y) coords for dragging using left mouse button
MouseDragLmbYStart AS INTEGER
MouseDragLmbXEnd AS INTEGER '* ending (x,y) coords for dragging using left mouse button
MouseDragLmbYEnd AS INTEGER
MouseDragRmbXStart AS INTEGER '* starting (x,y) coords for dragging using right mouse button
MouseDragRmbYStart AS INTEGER
MouseDragRmbXEnd AS INTEGER '* ending (x,y) coords for dragging using right mouse button
MouseDragRmbYEnd AS INTEGER
MouseDragBothXStart AS INTEGER '* starting (x,y) coords for dragging using (left+right) simultaneous mouse button: not yet implemented
MouseDragBothYStart AS INTEGER
MouseDragBothXEnd AS INTEGER '* ending (x,y) coords for dragging using (left+right) simultaneous mouse button: not yet implemented
MouseDragBothYEnd AS INTEGER
MWheelAccumulator AS INTEGER '* may be useful for scrolling screens & dialog boxes
END TYPE
DIM SHARED CursorAction%, mouselb%, mouserb%, mousebb%, deltamousex%, deltmousey%
DIM SHARED CMouseRec AS Mouserecord
DIM SHARED OMouseRec AS Mouserecord
'* profiling variables
DIM SHARED tsols#, tsolf#, tsils#, tsilf#, execute&, mousert&
CMouseRec.LmbPressed = 0 '* last time left mouse button was pressed
CMouseRec.RmbPressed = 0 '* last time right mouse button was pressed
CMouseRec.BothPressed = 0 '* last time both mouse buttons were pressed simultaneously -- might make a handy shortcut: not yet implemented
CMouseRec.lmbThreshhold = .25 '\
CMouseRec.rmbthreshhold = .25 ' * programmer-adjustable delays for detecting left,right and double mouse button single clicks
CMouseRec.boththreshhold = .25 '/
CMouseRec.lmbdblclickthreshhold = .20 '* programmer-adjustable delays for detecting left,right and double mouse button double clicks
CMouseRec.rmbdblclickthreshhold = .20
CMouseRec.bothdblclickthreshhold = .20
CursorAction% = 0
'*** end of CGMouseSub.bi
'* The Start of PETE'S program!
SCREEN 0
REM Print Playing Surface.
REM Size Window
style$ = "MONOSPACE"
fontsize% = 15
fontpath$ = ENVIRON$("SYSTEMROOT") + "\fonts\lucon.ttf" 'Find Windows Folder Path.
currentf& = _LOADFONT(fontpath$, fontsize%, style$)
_FONT currentf&
CLS
LOCATE , , 0, 7, 0
LOCATE 1, 30: PRINT "Super Mario Only Child"
LOCATE 25, 1: PRINT " Press Left Mouse Button to Jump Happy Over or On Top of the Bombs. Esc = Quit.";
LOCATE 10, 20: PRINT CHR$(148);: LOCATE 10, 35: PRINT CHR$(148);: LOCATE 10, 50: PRINT CHR$(148);: LOCATE 10, 65: PRINT CHR$(148);
LOCATE 5, 77: COLOR 9: PRINT CHR$(8);: COLOR 7: PRINT "|"
LOCATE 6, 77: PRINT " |"
LOCATE 7, 76: PRINT "^ | ^";
LOCATE 8, 76: PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176);
LOCATE 9, 76: PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176);
LOCATE 10, 76: PRINT "|"; CHR$(176); CHR$(239); CHR$(176); "|";
COLOR 4: LOCATE 11, 1: PRINT STRING$(80, 196);
COLOR 7
LOCATE 10, 3: PRINT CHR$(2);
LOCATE 10, 3
SLEEP 2
DO
tsols# = TIMER
'$include: 'GetMouseParams.bm'
GetMouseParams
execute& = execute& + 1
IF testing THEN
LOCATE 2, 1: PRINT USING "executed ################: mouse #################"; execute&; mousert&;
LOCATE 7, 1
PRINT USING "(x####:y####)"; CMouseRec.MouseX; CMouseRec.MouseY;
LOCATE 8, 1
PRINT USING "double-clicks l(#######) r(######) both(######) "; CMouseRec.countlmbdouble, CMouseRec.countrmbdouble, CMouseRec.countbothdouble;
LOCATE 9, 1
PRINT USING "single-clicks l(#######) r(######) both(######) "; CMouseRec.countlmbsingle, CMouseRec.countrmbsingle, CMouseRec.countbothsingle;
LOCATE 10, 1
PRINT USING "Mouse Wheel(#####)"; CMouseRec.MWheelAccumulator;
LOCATE 11, 1
PRINT USING "d(x####:y####)"; deltamousex%, deltamousey%;
tsolf# = TIMER
accout# = accout# - tsols# + tsolf#
LOCATE 12, 1
PRINT USING "Outer Loop execution #####.############ inner loop execution #####.###############"; accout#; accout# - tsols# + tsolf#;
LOCATE 13, 1
PRINT USING "LMB ## RMB ## L+R ##"; CMouseRec.MouseStateLmb; CMouseRec.MouseStateRmb; CMouseRec.MouseStateBoth;
END IF
SELECT CASE CMouseRec.MouseStateLmb
CASE 0
mousestatus% = 0
CASE ELSE
IF mousestatus% = 0 THEN mousestatus% = -1 ELSE mousestatus% = 1
END SELECT
time# = TIMER
IF time# - last# > .2 THEN
playerMove% = -1
last# = time#
END IF
IF mousestatus% THEN
IF jump% = 0 THEN
jump% = -2: junpheight% = -1
LOCATE , POS(1) - 1: PRINT " ";: LOCATE 8
END IF
mousestatus% = 0
ELSE
IF jump% < 0 THEN
jump% = jump% + 1
IF jump% = 0 THEN junpheight% = 0: LOCATE , POS(1) - 1: PRINT " ";
END IF
END IF
REM If Time Elapsed, Move!
IF playerMove% = -1 THEN
playerMove% = 0
IF POS(1) < 2 THEN i% = 0 ELSE i% = 1
LOCATE 10 + junpheight%, POS(1) - i%: PRINT " " + CHR$(2);
REM If in Air, Descend!
REM Winner!
IF POS(1) > 75 THEN LOCATE 15, 37: PRINT "You Won!": EXIT DO
END IF
REM Evaluate
IF POS(1) >= 20 THEN
xy% = SCREEN(CSRLIN, POS(1), 0)
IF xy% <> 32 THEN
SELECT CASE jump%
CASE 0
LOCATE 15, 36: PRINT "Game Over!": EXIT DO
CASE ELSE
END SELECT
END IF
END IF
'_LIMIT 1000
LOOP UNTIL INKEY$ = CHR$(27)
END
'* GetMouseParams.bm
SUB GetMouseParams
DO
tsils# = TIMER
mousert& = mousert& + 1
IF _MOUSEINPUT THEN
CMouseRec.MouseX = _MOUSEX
CMouseRec.MouseY = _MOUSEY
wheel% = _MOUSEWHEEL
IF wheel% THEN
CMouseRec.MWheelAccumulator = CMouseRec.MWheelAccumulator + wheel%
IF CMouseRec.MWheelAccumulator <> OMouseRec.MWheelAccumulator THEN
'* put your mousewheel handling code here
IF CMouseRec.MWheelAccumulator < OMouseRec.MWheelAccumulator THEN
ELSE
END IF
OMouseRec.MWheelAccumulator = CMouseRec.MWheelAccumulator
END IF
END IF
CursorAction% = 0
IF CMouseRec.MouseX <> OMouseRec.MouseX THEN
CMouseRec.ActionX = Cursoractx
deltamousex% = CMouseRec.MouseX - OMouseRec.MouseX
OMouseRec.MouseX = CMouseRec.MouseX
END IF
IF CMouseRec.MouseY <> OMouseRec.MouseY THEN
CMouseRec.ActionY = Cursoracty
deltamousey% = CMouseRec.MouseY - OMouseRec.MouseY
OMouseRec.MouseY = CMouseRec.MouseY
END IF
TimeHold# = TIMER
CMouseRec.MouseStateLmb = _MOUSEBUTTON(1)
CMouseRec.MouseStateRmb = _MOUSEBUTTON(2)
CMouseRec.MouseStateBoth = _MOUSEBUTTON(3)
anybuttonpressed% = 0
IF CMouseRec.MouseStateBoth THEN
anybuttonpressed% = mousebb%
CMouseRec.BothPressed = TimeHold#
ELSE
IF CMouseRec.MouseStateLmb THEN
anybuttonpressed% = mouselb%
CMouseRec.LmbPressed = TimeHold#
END IF
IF CMouseRec.MouseStateRmb THEN
anybuttonpressed% = mouserb%
CMouseRec.RmbPressed = TimeHold#
END IF
END IF
SELECT CASE anybuttonpressed%
CASE mousebb%
IF ABS(CMouseRec.BothPressed - OMouseRec.BothPressed) > CMouseRec.boththreshhold THEN
CMouseRec.dblboth = 0
CMouseRec.countbothsingle = CMouseRec.countbothsingle + 1
OMouseRec.MouseStateBoth = NOT (CMouseRec.MouseStateBoth)
CMouseRec.MouseDragBothXStart = -1
CMouseRec.MouseDragBothYStart = -1
ELSE
IF ABS(CMouseRec.BothPressed - OMouseRec.BothPressed) >= CMouseRec.bothdblclickthreshhold THEN
CMouseRec.dblboth = -1
CMouseRec.countbothdouble = CMouseRec.countbothdouble + 1
ELSE
IF CMouseRec.MouseStateBoth <> OMouseRec.MouseStateBoth OR -1 THEN
IF CMouseRec.MouseStateBoth = OMouseRec.MouseStateBoth THEN
IF CMouseRec.MouseDragBothXStart = -1 THEN
CMouseRec.MouseDragBothXStart = CMouseRec.MouseX
CMouseRec.MouseDragBothYStart = CMouseRec.MouseY
ELSE
CMouseRec.MouseDragBothXEnd = CMouseRec.MouseX
CMouseRec.MouseDragBothYEnd = CMouseRec.MouseY
END IF
'* LOCATE 4, 1
'* PRINT USING "sb(x####:y####) eb(x####:y####)"; CMouseRec.MouseDragBothXStart, CMouseRec.MouseDragBothYStart, CMouseRec.MouseDragBothXEnd, CMouseRec.MouseDragBothYEnd;
ELSE
OMouseRec.MouseStateBoth = CMouseRec.MouseStateBoth
CMouseRec.MouseDragBothXStart = -1
CMouseRec.MouseDragBothYStart = -1
END IF
END IF
END IF
END IF
OMouseRec.BothPressed = TimeHold#
CASE mouselb%
IF ABS(CMouseRec.LmbPressed - OMouseRec.LmbPressed) > CMouseRec.lmbThreshhold THEN
CMouseRec.dbllmb = 0
CMouseRec.countlmbsingle = CMouseRec.countlmbsingle + 1
OMouseRec.MouseStateLmb = NOT (CMouseRec.MouseStateLmb)
CMouseRec.MouseDragLmbXStart = -1
CMouseRec.MouseDragLmbYStart = -1
ELSE
IF ABS(CMouseRec.LmbPressed - OMouseRec.LmbPressed) >= CMouseRec.lmbdblclickthreshhold THEN
CMouseRec.dbllmb = -1
CMouseRec.countlmbdouble = CMouseRec.countlmbdouble + 1
ELSE
IF CMouseRec.MouseStateLmb <> OMouseRec.MouseStateLmb OR -1 THEN
IF CMouseRec.MouseStateLmb = OMouseRec.MouseStateLmb THEN
IF CMouseRec.MouseDragLmbXStart = -1 THEN
CMouseRec.MouseDragLmbXStart = CMouseRec.MouseX
CMouseRec.MouseDragLmbYStart = CMouseRec.MouseY
ELSE
CMouseRec.MouseDragLmbXEnd = CMouseRec.MouseX
CMouseRec.MouseDragLmbYEnd = CMouseRec.MouseY
END IF
'* LOCATE 5, 1
'* PRINT USING "sl(x####:y####) el(x####:y####)"; CMouseRec.MouseDragLmbXStart, CMouseRec.MouseDragLmbYStart, CMouseRec.MouseDragLmbXEnd, CMouseRec.MouseDragLmbYEnd;
ELSE
OMouseRec.MouseStateLmb = CMouseRec.MouseStateLmb
CMouseRec.MouseDragLmbXStart = -1
CMouseRec.MouseDragLmbYStart = -1
END IF
END IF
END IF
END IF
OMouseRec.LmbPressed = TimeHold#
CASE mouserb%
IF ABS(CMouseRec.RmbPressed - OMouseRec.RmbPressed) > CMouseRec.rmbthreshhold THEN
CMouseRec.dblrmb = 0
CMouseRec.countrmbsingle = CMouseRec.countrmbsingle + 1
OMouseRec.MouseStateRmb = NOT (CMouseRec.MouseStateRmb)
CMouseRec.MouseDragRmbXStart = -1
CMouseRec.MouseDragRmbYStart = -1
ELSE
IF ABS(CMouseRec.RmbPressed - OMouseRec.RmbPressed) >= CMouseRec.rmbdblclickthreshhold THEN
CMouseRec.dblrmb = -1
CMouseRec.countrmbdouble = CMouseRec.countrmbdouble + 1
ELSE
IF CMouseRec.MouseStateRmb <> OMouseRec.MouseStateRmb OR -1 THEN
IF CMouseRec.MouseStateRmb = OMouseRec.MouseStateRmb THEN
IF CMouseRec.MouseDragRmbXStart = -1 THEN
CMouseRec.MouseDragRmbXStart = CMouseRec.MouseX
CMouseRec.MouseDragRmbYStart = CMouseRec.MouseY
ELSE
CMouseRec.MouseDragRmbXEnd = CMouseRec.MouseX
CMouseRec.MouseDragRmbYEnd = CMouseRec.MouseY
END IF
'* LOCATE 6, 1
'* PRINT USING "sr(x####:y####) er(x####:y####)"; CMouseRec.MouseDragRmbXStart, CMouseRec.MouseDragRmbYStart, CMouseRec.MouseDragRmbXEnd, CMouseRec.MouseDragRmbYEnd;
ELSE
OMouseRec.MouseStateRmb = CMouseRec.MouseStateRmb
CMouseRec.MouseDragRmbXStart = -1
CMouseRec.MouseDragRmbYStart = -1
END IF
END IF
END IF
END IF
OMouseRec.RmbPressed = TimeHold#
CASE ELSE
EXIT DO
END SELECT
ELSE
EXIT DO
END IF
LOOP
END SUB