Ooops
October 28, 2020, 06:15:23 AM

Author Topic: [bmx] mouse handling by Jesse [ 1+ years ago ]  (Read 1203 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] mouse handling by Jesse [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : mouse handling
Author : Jesse
Posted : 1+ years ago

Description : single button control
returns double click; thrust for x, y and mouse wheel; button released, inuse, and activated.
one of the advantages of this over regular Bmax mouse functions is tha is that the mouse is updated once per flip()and does not clear the mouse hitButton buffer until the next flip() all functions are upto date per current flip()
remove Rem, EndRem to test.


Code :
Code: BlitzMax
  1. Const   BUTTONLOCKED            :Int =  2
  2. Const   BUTTONPRESSED           :Int =  1
  3. Const   BUTTONFREE              :Int =  0
  4.  
  5. Const   REPEATTIME      :Int =250 'in milliseconds
  6. Global  mouse   :tmouse = New Tmouse
  7. Function MyHook:Object( id:Int,data:Object,context:Object )
  8.         mouse.Load()
  9. End Function
  10.  
  11. 'Add our hook to the system
  12. AddHook FlipHook,MyHook
  13.  
  14. Type Tbutton
  15.        
  16.         Field   activated               :Int
  17.         Field   inuse           :Int
  18.         Field   free                    :Int
  19. End Type
  20.  
  21. Type Tmouse
  22.  
  23.  
  24.         Field   x                                       :Int,..
  25.                         y                                       :Int,..
  26.                         Pressed                         :Int[3],..
  27.                         DoublePressed                   :Int[3],..
  28.                         mousewheel                      :Int   
  29.        
  30.         Field   oldx                                    :Int,..
  31.                         oldy                                    :Int,..
  32.                         oldpressed                      :Int[3],..
  33.                         oldmousewheel                   :Int
  34.  
  35.         Field   turnDifference                  :Int,..
  36.                         selected                                :Int
  37.        
  38.         Field   state                           :Int[3],..
  39.                         ClickCount                      :Int[3],..
  40.                         endtime                         :Long[3]
  41.  
  42.         ' loads all of the mouse processes such as
  43.         ' mouse x, y, z, buttons and click, double, double click.
  44.         ' mouse pressed, used and released.
  45.         ' needs be called at the beginning of each frame.
  46.  
  47.         Method Load()
  48.                 oldx = x
  49.                 oldy = y
  50.                 oldmousewheel = mousewheel
  51.                
  52.                 x = MouseX()
  53.                 y = MouseY()
  54.                 mousewheel = MouseZ()
  55.                
  56.                 turnDifference = mouseWheel - oldMouseWheel            
  57.  
  58.                 For Local b:Int = 0 To 2
  59.                        
  60.                         oldpressed[b] = pressed[b]
  61.                         pressed[b] = MouseDown(b+1)  
  62.                        
  63.                         If oldpressed[b]
  64.                        
  65.                                 If pressed[b]
  66.                                         state[b] = BUTTONLOCKED
  67.                                 Else
  68.                                         state[b] = BUTTONFREE
  69.                                 EndIf
  70.                        
  71.                         ElseIf pressed[b]
  72.                        
  73.                                 state[b] = BUTTONPRESSED
  74.                        
  75.                         EndIf
  76.                
  77.                         DoublePressed[b] = False
  78.                
  79.                         If state[b] = BUTTONPRESSED
  80.                        
  81.                                 If ClickCount[b] = 0
  82.                        
  83.                                         ClickCount[b] = 1 'first click
  84.                                         endtime[b] = MilliSecs() + REPEATTIME
  85.                        
  86.                                 Else'second click
  87.                        
  88.                                         If MilliSecs() < endtime[b]
  89.                                                 DoublePressed[b] = True
  90.                                         EndIf
  91.                                         ClickCount[b] = 0
  92.                        
  93.                                 EndIf
  94.                         ElseIf MilliSecs() > Endtime[b]
  95.                        
  96.                                 ClickCount[b] = 0
  97.                        
  98.                         EndIf
  99.                 Next
  100.         End Method
  101.         ' checks if mouse cursor is with in a specified area
  102.         ' h = start x
  103.         ' v = start y
  104.         ' width of area
  105.         ' height of area
  106.         ' returns true if in area false if not 
  107.  
  108.         Method InArea:Int(h:Int, v:Int, width:Int, height:Int) 
  109.  
  110.                 If x < h Return False
  111.                 If x > (h+Width) Return False
  112.                 If y < v Return False
  113.                 If y > (v + Height) Return False
  114.                 Return True
  115.  
  116.         End Method
  117.        
  118.         ' returns mouse x and y position
  119.         ' through input variables a and d.
  120.  
  121.         Method GetXY(a:Int Var, d:Int Var)
  122.  
  123.                 a=Self.x
  124.                 d=Self.y
  125.  
  126.         End Method
  127.        
  128.         'returns true if a mouse "double click" was completed with in current cycle frame.      
  129.  
  130.         Method doubleclick:Int(selected:Int = 1)
  131.                 selected :- 1
  132.                 selected :& 3
  133.                
  134.                 Return DoublePressed[selected]
  135.  
  136.         End Method
  137.        
  138.         ' returns true if a specified mouse button is still pressed based on previos frame.
  139.        
  140.         Method ButtonInUse:Int(selected:Int = 1)
  141.                 selected :- 1
  142.                 selected :& 3
  143.  
  144.                 If state[selected] = BUTTONLOCKED
  145.                         Return True
  146.                 EndIf
  147.                 Return False
  148.  
  149.         End Method
  150.        
  151.         ' returns true if the pre-specified mouse button was pressed on current frame.
  152.        
  153.         Method ButtonActivated:Int(selected:Int = 1)
  154.                 selected :- 1
  155.                 selected :& 3
  156.  
  157.                 If state[selected] = BUTTONPRESSED
  158.                         Return True
  159.                 EndIf
  160.                 Return False
  161.  
  162.         End Method
  163.        
  164.         'returns true if a pre-specified buttone is currently released
  165.        
  166.         Method ButtonReleased:Int(selected:Int = 1)
  167.                 selected :- 1
  168.                 selected :& 3
  169.                
  170.                 If state[selected] = BUTTONFREE
  171.                         Return True
  172.                 EndIf
  173.                 Return False
  174.  
  175.         End Method
  176.        
  177.         'return true if the mouse button was moved based on previos frame and current frame.
  178.        
  179.         Method moved:Int()
  180.  
  181.                 If oldx <> x Return True
  182.                 If oldy <> y Return True
  183.                 Return False
  184.  
  185.         End Method
  186.        
  187.         ' same as above but for x only
  188.        
  189.         Method MovedX:Int()
  190.  
  191.                 If oldx <> x Return True
  192.                 Return False
  193.  
  194.         End Method
  195.        
  196.         ' same as above but for y only
  197.        
  198.         Method movedy:Int()
  199.  
  200.                 If oldy <> y Return True
  201.                 Return False
  202.  
  203.         End Method
  204.        
  205.         ' returns mouse speed(difference between current frame x and previous frame x
  206.        
  207.         Method Thrustx:Int()
  208.  
  209.                 Return x - oldx
  210.  
  211.         End Method
  212.        
  213.         ' returns mouse speed(difference between current frame y and previous frame y
  214.        
  215.         Method Thrusty:Int()
  216.  
  217.                 Return y - oldy
  218.  
  219.         End Method
  220.        
  221.         ' returns mouse wheel speed based on current frame and prvious frame position.
  222.        
  223.         Method wheelThrust:Int()
  224.  
  225.                 Return TurnDifference
  226.  
  227.         End Method
  228.  
  229. End Type
  230.  
  231.  
  232. rem
  233. Local boxx:Int  = 100
  234. Local boxy:Int  = 100
  235. Local boxwidth:Int      = 100
  236. Local boxheight:Int = 100
  237. Local displaytime:Int = 1000 'millisecs
  238. Local display:Int       = MilliSecs()
  239. Local display2:Int      = MilliSecs()
  240. Local red%,green%,blue%
  241. Graphics 800,600
  242. SetBlend ALPHABLEND
  243. Repeat
  244.         Cls()
  245.         SetAlpha .3
  246.         DrawRect boxx,boxy,boxwidth,boxheight
  247.         DrawText "double click", 105,130
  248.         DrawText "   in here",105,150
  249.         SetAlpha 1.0
  250.  
  251.         If mouse.InArea(boxx,boxy,boxwidth,boxheight)
  252.                 DrawText "insidebox",MouseX(),MouseY()
  253.                 If Mouse.doubleclick()
  254.                         red = Rnd(255)
  255.                         green = Rnd(255)
  256.                         blue = Rnd(255)
  257.                         display = displaytime+MilliSecs()
  258.                 EndIf
  259.         EndIf
  260.         If display > MilliSecs()
  261.                 SetColor red,green,blue
  262.                 DrawText "double clicked",100,80
  263.         EndIf
  264.         SetColor 255,255,255
  265.         DrawText mouse.Thrustx()+" xspeed",100,200
  266.         DrawText mouse.Thrusty()+" yspeed",100,220
  267.         If mouse.Thrustx()
  268.                 If mouse.thrusty()
  269.                         DrawText "moving Diagonally",100,240
  270.                 Else
  271.                         DrawText "moving Horizontally",100,240
  272.                 EndIf
  273.         Else
  274.                 If mouse.Thrusty()
  275.                         DrawText "moving Vertically",100,240
  276.                 EndIf
  277.         EndIf
  278.         DrawText "checking button "+(mouse.selected+1),100,320
  279.         If mouse.buttoninUse()DrawText "button in use",100,260
  280.         If mouse.buttonReleased() DrawText "button is free",100,260
  281.         If mouse.buttonActivated() display2 = displaytime+MilliSecs()
  282.         If display2> MilliSecs() DrawText "button was activated",100,280
  283.         DrawText "mouse wheel speed = "+mouse.wheelThrust(),100,300
  284.         Flip()
  285. Until KeyDown(key_escape)
  286. endrem


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal