Hier ist ein erster selbstgebastelter Versuch eine Gestenerkennung in Monkey zu schreiben. Der Code verwendet keine nativen Java-Funktionen, sondern nur den Touch() Befehl aus Monkey. Auf meinem Android läuft es, es dürfte aber auch am Iphone laufen.
Zum Implementieren wird nur die Klasse Gesture benötigt. Dem Code hier habe ich auch gleich ein lauffähiges Beispiel hinzugefügt.
Zur Zeit können folgende Gesten erkannt werden:
Zoomen, Rotieren, Bewegen und Klicken.
Version=0.81 Ich werde es wahrscheinlich noch weiter ausbauen....
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN] Strict Import mojo
Class GestureTest Extends App
Field MyScale#=1, MyRotation%=0, MyBoxColor%, MyX%, MyY% Field Gestures:Gestures
Method OnCreate%() Gestures=New Gestures SetUpdateRate 30 Return 0 End
Method OnUpdate%() If KeyHit(KEY_ESCAPE) Then Error "" Gestures.Update() MyScale=MyScale*Gestures.LastZoom() MyRotation=MyRotation + Gestures.LastAngle() MyX=MyX + Gestures.LastX() MyY=MyY + Gestures.LastY() If Gestures.ItWasAHit() MyBoxColor=Int(Rnd(5)) End Return 0 End
Method OnRender%() Cls Local ActScale#=MyScale*Gestures.TempZoom() Local ActRotation%=MyRotation+Gestures.TempAngle() Local ActTranslationX%=MyX+Gestures.TempX() Local ActTranslationY%=MyY+Gestures.TempY() Translate 120,160 Translate ActTranslationX,ActTranslationY Scale ActScale,ActScale Rotate ActRotation DrawRect -50,-40,100,80 SetColorIndex MyBoxColor DrawRect -50,-40,100,20 Return 0 End End
Function Main%() New GestureTest Return 0 End
Function SetColorIndex:Void(No%) Select No Case 0 SetColor 255,0,0 Case 1 SetColor 255,255,0 Case 2 SetColor 0,255,0 Case 3 SetColor 255,0,255 Case 4 SetColor 0,0,255 End Select End
Class Gestures
Field NewHit%=False Field StartZoom#, LastZoomValue#=1,TempZoomValue#=1 Field StartAngle#,LastAngleValue#=0, TempAngleValue#=0 Field StartX%, StartY%, LastXValue%, LastYValue%, TempXValue%, TempYValue%
Field GestureTyp% Const G_ONE%=1, G_HIT%=2, G_BOTH%=4, G_MOVE%=8, G_ZOOM%=16, G_ROTATE%=32
Method Update:Void() Local NowZoom#= Pow(TouchX(0)-TouchX(1),2) + Pow(TouchY(0)-TouchY(1),2) Local NowAngle% = (360+ ATan2( TouchX(0)-TouchX(1), TouchY(0)-TouchY(1) ) ) Mod 360 Local NowX%=TouchX(0) Local NowY%=TouchY(0) TempZoomValue=1 TempAngleValue=0 TempXValue=0 TempYValue=0 If TouchDown(0) And TouchDown(1)
If GestureTyp<G_BOTH GestureTyp=G_BOTH StartZoom=NowZoom StartAngle = NowAngle EndIf
Local locZoom#=NowZoom/StartZoom Select GestureTyp Case G_ROTATE TempAngleValue = NowAngle-StartAngle Case G_ZOOM TempZoomValue=locZoom Case G_BOTH If ((Abs(NowAngle-StartAngle)>15) ) GestureTyp=G_ROTATE TempAngleValue = NowAngle-StartAngle ElseIf (locZoom>1.2) Or (locZoom<0.8) TempZoomValue=locZoom GestureTyp=G_ZOOM EndIf End Select ElseIf TouchDown(0) If GestureTyp=0 GestureTyp=G_ONE StartX=NowX StartY=NowY EndIf Select GestureTyp Case G_MOVE TempXValue=NowX-StartX TempYValue=NowY -StartY Case G_ONE If Pow(NowX-StartX,2)+Pow(NowY-StartY,2)>20 Print "move" GestureTyp=G_MOVE TempXValue=NowX-StartX TempYValue=NowY-StartY EndIf End Select Else If GestureTyp>0 Select GestureTyp Case G_ROTATE LastAngleValue= NowAngle-StartAngle Case G_ZOOM LastZoomValue= NowZoom/StartZoom Case G_MOVE Print "was move" LastXValue=NowX-StartX LastYValue=NowY-StartY Default Print "hit" NewHit=True End Select GestureTyp=0 EndIf EndIf End
Method LastZoom#() Local loc#=LastZoomValue If loc=1 Then Return 1 LastZoomValue=1 Return loc End Method
Method LastAngle#() Local loc#= LastAngleValue If loc=0 Then Return 0 LastAngleValue=0 Return loc End Method
Method LastX#() Local loc#=LastXValue If loc=1 Then Return 0 LastXValue=0 Return loc End
Method LastY#() Local loc#=LastYValue If loc=1 Then Return 0 LastYValue=0 Return loc End
Method ItWasAHit%() Local loc%= NewHit NewHit=False Return loc End
Method TempZoom#() Return TempZoomValue End
Method TempAngle#() Return TempAngleValue End Method TempX#() Return TempXValue End Method TempY#() Return TempYValue End End
|