touch.monkey2 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. Namespace mojo.input
  2. #rem monkeydoc Global instance of the TouchDevice class.
  3. #end
  4. Const Touch:=New TouchDevice
  5. #rem monkeydoc The TouchDevice class.
  6. To access the touch device, use the global [[Touch]] constant.
  7. The touch device should only used after a new [[AppInstance]] is created.
  8. #end
  9. Class TouchDevice
  10. Method FingerDown:Bool( finger:Int )
  11. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  12. Return _fingers[finger].down
  13. End
  14. Method FingerPressed:Bool( finger:Int )
  15. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  16. Return _fingers[finger].pressed=_frame
  17. End
  18. Method FingerReleased:Bool( finger:Int )
  19. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  20. Return _fingers[finger].released=_frame
  21. End
  22. Method FingerPressure:Float( finger:Int )
  23. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  24. Return _fingers[finger].pressure
  25. End
  26. Method FingerX:Int( finger:Int )
  27. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  28. Return _fingers[finger].location.x
  29. End
  30. Method FingerY:Int( finger:Int )
  31. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  32. Return _fingers[finger].location.y
  33. End
  34. Method FingerLocation:Vec2i( finger:Int )
  35. DebugAssert( finger>=0 And finger<10,"Finger index out of range" )
  36. Return _fingers[finger].location
  37. End
  38. '***** INTERNAL *****
  39. #rem monkeydoc @hidden
  40. #end
  41. Method Init()
  42. End
  43. #rem monkeydoc @hidden
  44. #end
  45. Method Update()
  46. _frame+=1
  47. End
  48. #rem monkeydoc @hidden
  49. #end
  50. Method EventLocation:Vec2i( tevent:SDL_TouchFingerEvent Ptr )
  51. Local window:=App.ActiveWindow
  52. Local p:=New Vec2i( tevent->x * window.Frame.Width,tevent->y * window.Frame.Height )
  53. Return window.TransformPointFromView( p,Null )
  54. End
  55. #rem monkeydoc @hidden
  56. #end
  57. Method SendEvent( event:SDL_Event Ptr )
  58. If Not App.ActiveWindow Return
  59. Select event->type
  60. Case SDL_FINGERDOWN
  61. Local tevent:=Cast<SDL_TouchFingerEvent Ptr>( event )
  62. ' Print "SDL_FINGERDOWN, id="+tevent->fingerId
  63. Local id:=-1
  64. For Local i:=0 Until 10
  65. If _fingers[i].down Continue
  66. _fingers[i].id=tevent->fingerId
  67. id=i
  68. Exit
  69. Next
  70. If id=-1 Return
  71. _fingers[id].down=True
  72. _fingers[id].pressed=_frame
  73. _fingers[id].pressure=tevent->pressure
  74. _fingers[id].location=EventLocation( tevent )
  75. Case SDL_FINGERUP
  76. Local tevent:=Cast<SDL_TouchFingerEvent Ptr>( event )
  77. ' Print "SDL_FINGERUP, id="+tevent->fingerId
  78. Local id:=-1
  79. For Local i:=0 Until 10
  80. If Not _fingers[i].down Or _fingers[i].id<>tevent->fingerId Continue
  81. id=i
  82. Exit
  83. Next
  84. If id=-1 Return
  85. _fingers[id].down=False
  86. _fingers[id].released=_frame
  87. _fingers[id].pressure=0
  88. _fingers[id].location=EventLocation( tevent )
  89. Case SDL_FINGERMOTION
  90. Local tevent:=Cast<SDL_TouchFingerEvent Ptr>( event )
  91. ' Print "SDL_FINGERMOTION, id="+tevent->fingerId
  92. Local id:=-1
  93. For Local i:=0 Until 10
  94. If Not _fingers[i].down Or _fingers[i].id<>tevent->fingerId Continue
  95. id=i
  96. Exit
  97. Next
  98. If id=-1 Return
  99. _fingers[id].pressure=tevent->pressure
  100. _fingers[id].location=EventLocation( tevent )
  101. End
  102. End
  103. Private
  104. Struct FingerState
  105. Field id:Long
  106. Field down:Bool
  107. Field pressed:Int
  108. Field released:Int
  109. Field pressure:Float
  110. Field location:Vec2i
  111. End
  112. Field _frame:Int=1
  113. Field _fingers:=New FingerState[10]
  114. Method New()
  115. End
  116. End