About Monkey 2 › Forums › Monkey 2 Programming Help › Space Monkey
Tagged: Star shooter Gesture
This topic contains 3 replies, has 3 voices, and was last updated by
Gwenel
1 year ago.
-
AuthorPosts
-
March 22, 2018 at 7:00 am #14092
Taking a pause from other programming to do some Monkey2. Great fun so far !
Making a simple space shootem’up and now I want to try out and use gestures for finding star systems that you need to go to.I found a great banana example but it seems to have strange behaviour when you release the fingers it bounces back
Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121Namespace Myapp#Import "<std>"#Import "<mojo>"#Import "<mojo3d>"#Import "<sdl2>"Using std..Using mojo..Using mojo3d..Using sdl2..Global instance:AppInstanceGlobal mylist:List<star> = New List<star>Const w:=1920, h:=1080Class starField s:Vec2fField m:Vec2fMethod New()s.X = Rnd(0,w)s.Y = Rnd(0,h)m.X = Rnd(-6,-01)End MethodMethod update()s+=mIf s.X < 0 Then s.X = wEnd MethodMethod draw(canvas:Canvas)canvas.Color = Color.Whitecanvas.DrawPoint(s.X,s.Y)canvas.DrawPoint(s.X+1,s.Y)canvas.DrawPoint(s.X+1,s.Y+1)canvas.DrawPoint(s.X,s.Y+1)End MethodEnd ClassClass Myapp Extends WindowPublicField gesturing:BoolField g0:AffineMat3fField oldg0:AffineMat3fField _drawImage:ImageField _drawCanvas:CanvasField _mouseDown:BoolField _mousePrevious:Vec2iField count:Int=1Field cnt:=0Method OnUpdate()RequestRender()cnt+=1EndMethod GestureMatrix:AffineMat3f( p0:Vec2f,p1:Vec2f )Local d:=p1-p0,r:=-ATan2( d.y,d.x ),s:=d.LengthReturn New AffineMat3f().Translate( p0 ).Rotate( r ).Scale( s,s )EndMethod OnKeyEvent(event:KeyEvent) OverrideSelect event.TypeCase EventType.KeyDownSelect event.KeyCase Key.EscapeApp.Terminate()EndEndEndField canvas:CanvasField wx:Int, wy:IntField xsdl:Int, oxsdl:IntField ysdl:Int, oysdl:IntMethod New( title:String="Myapp",width:Int=w,height:Int=h,flags:WindowFlags=WindowFlags.Resizable | WindowFlags.Fullscreen )Super.New(title,w,h,flags)ClearColor = Color.BlackFor Local i:=0 To 1000mylist.AddLast(New star())NextMouse.PointerVisible=FalseEndMethod OnRender(canvas:Canvas) OverrideSDL_GetMouseState(Varptr xsdl, Varptr ysdl) ' xsdl & ysdl is fastest mouseApp.RequestRender()' ------------------------------------------------------------------------------------------------' GESTURE CODELocal gmatrix:=New AffineMat3fIf Not gesturing And Touch.FingerDown( 0 ) And Touch.FingerDown( 1 )' begin gesturingg0=-GestureMatrix( Touch.FingerLocation( 0 ),Touch.FingerLocation( 1 ) )gesturing=TrueEndifIf gesturing And Touch.FingerDown( 0 ) And Touch.FingerDown( 1 )' gesturing...gmatrix=GestureMatrix( Touch.FingerLocation( 0 ),Touch.FingerLocation( 1 ) ) * g0Else If gesturing'end gesturinggesturing=FalseEndif' ------------------------------------------------------------------------------------------------canvas.PushMatrix()canvas.Matrix=gmatrixFor Local i:=Eachin mylisti.update()i.draw(canvas)Nextcanvas.PopMatrix()canvas.Flush()EndEndFunction Main()New AppInstanceNew Myapp(w,h)App.Run()EndMarch 22, 2018 at 3:22 pm #14099I have not done any touch things yet but I noticed you use touchdown. Is there no touchup or release? I would. Look at that.
March 22, 2018 at 4:27 pm #14100No it’s not about finger up and down because I can do this to save the position (but it does not anything but a black screen if your device have no multitouch of course now).
It’s all about making the touch movement relative, you need to be able to “remember” the last position so to speak and “add” each additional movement and this works by using matrixes and I know nothing about matrixes?
Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124Namespace Myapp#Import "<std>"#Import "<mojo>"#Import "<mojo3d>"#Import "<sdl2>"Using std..Using mojo..Using mojo3d..Using sdl2..Global instance:AppInstanceGlobal mylist:List<star> = New List<star>Const w:=1920, h:=1080Class starField s:Vec2fField m:Vec2fMethod New()s.X = Rnd(0,w)s.Y = Rnd(0,h)m.X = Rnd(-6,-01)End MethodMethod update()s+=mIf s.X < 0 Then s.X = wEnd MethodMethod draw(canvas:Canvas)canvas.Color = Color.Whitecanvas.DrawPoint(s.X,s.Y)canvas.DrawPoint(s.X+1,s.Y)canvas.DrawPoint(s.X+1,s.Y+1)canvas.DrawPoint(s.X,s.Y+1)End MethodEnd ClassClass Myapp Extends WindowPublicField gesturing:BoolField g0:AffineMat3fField oldg0:AffineMat3fField _drawImage:ImageField _drawCanvas:CanvasField _mouseDown:BoolField _mousePrevious:Vec2iField count:Int=1Field cnt:=0Method OnUpdate()RequestRender()cnt+=1EndMethod GestureMatrix:AffineMat3f( p0:Vec2f,p1:Vec2f )Local d:=p1-p0,r:=-ATan2( d.y,d.x ),s:=d.LengthReturn New AffineMat3f().Translate( p0 ).Rotate( r ).Scale( s,s )EndMethod OnKeyEvent(event:KeyEvent) OverrideSelect event.TypeCase EventType.KeyDownSelect event.KeyCase Key.EscapeApp.Terminate()EndEndEndField canvas:CanvasField wx:Int, wy:IntField xsdl:Int, oxsdl:IntField ysdl:Int, oysdl:IntMethod New( title:String="Myapp",width:Int=w,height:Int=h,flags:WindowFlags=WindowFlags.Resizable | WindowFlags.Fullscreen )Super.New(title,w,h,flags)ClearColor = Color.BlackFor Local i:=0 To 1000mylist.AddLast(New star())NextMouse.PointerVisible=FalseEndMethod OnRender(canvas:Canvas) OverrideSDL_GetMouseState(Varptr xsdl, Varptr ysdl) ' xsdl & ysdl is fastest mouseApp.RequestRender()' ------------------------------------------------------------------------------------------------' GESTURE CODELocal gmatrix:=New AffineMat3fIf Not gesturing And Touch.FingerDown( 0 ) And Touch.FingerDown( 1 )' begin gesturingg0=-GestureMatrix( Touch.FingerLocation( 0 ),Touch.FingerLocation( 1 ) )gesturing=TrueEndifIf gesturing And Touch.FingerDown( 0 ) And Touch.FingerDown( 1 )' gesturing...Else If gesturing'end gesturinggesturing=FalseEndifgmatrix=GestureMatrix( Touch.FingerLocation( 0 ),Touch.FingerLocation( 1 ) ) * g0' ------------------------------------------------------------------------------------------------canvas.PushMatrix()canvas.Matrix=gmatrixFor Local i:=Eachin mylisti.update()i.draw(canvas)Nextcanvas.PopMatrix()canvas.Flush()EndEndFunction Main()New AppInstanceNew Myapp(w,h)App.Run()EndApril 5, 2018 at 4:29 pm #14259One can use this general formula
‘ Rotation
var startVector = point#0.start – point#1.start
var currentVector = point#0.current – point#1.current
var startAngle = math.atan2( startVector.Y, startVector.X )
var endAngle = math.atan2( currentVector.Y, currentVector.X )
var deltaAngle = endAngle – startAngle‘ Panning
var startCenter = (point#0.start – point#1.start)/2 + point#1.start
var currentCenter = (point#0.current – point#1.current)/2 + point#1.current
var rawTrans = currentCenter – startCenter
‘ Now add rotation to rawtrans and call it translation
var rotationMatrix = matrix.rotationZ(-angle)
var translation = vector.transform(rawTrans, rotationMatrix)‘ Zooming
var startVector = point#0.start – point#1.start
var currentVector = point#0.current – point#1.current
var scale = vector.length(currentVector) / vector.length(startVector)
var translation = vector.transform(rawTrans, rotationMatrix) / scale -
AuthorPosts
You must be logged in to reply to this topic.