lua - Corona SDk - how to get a moving object to rotate and travel to a tap point? -
i new programming enjoying learning corona trial , error (mostly error!)
i working on creating air traffic control sim college project , have run brick wall on how object (airplane on radar) turn , travel tap point.
i using following code move airplanes:
local function moveairplane1(event) function cleanairplaneruntime() runtime:removeeventlistener("enterframe", moveairplane1) end if airplane1onradar == false cleanei137runtime() end airplane1.x = airplane1.x + math.cos(math.rad(airplane1.rotation)) * airplane1speed airplane1.y = airplane1.y + math.sin(math.rad(airplane1.rotation)) * airplane1speed end runtime:addeventlistener("enterframe", moveairplane1)
this works fine , can control direction adding or subtracting airplane.rotation value. however, want allow player tap screen , have airplane rotate , travel point.
i have been trying calculate angle between tap point , airplane , rotating aircraft difference there many permutations depending on quadrant airplane in , quadrant tap point in relative airplane i'm wondering if i'm on right track @ or there simple way missing?
here have been trying (apologies, long winded)
function vectorto() function setvectorpoint(event) vectorpoint = display.newcircle(0, 0, 5) vectorpoint.x = event.x vectorpoint.y = event.y vectorpoint.alpha = 0.5 airplane = ei159 vp = vectorpoint airplanehdg = ei159currentheading runtime:removeeventlistener("tap", setvectorpoint) function anglebetween(vp, airplane ) -- calculate angle between airplane , tap point airplane = airplane1 vp = vectorpoint xdist = airplane.x - vp.x ydist = airplane.y - vp.y anglebetween = math.deg( math.atan( ydist/xdist ) ) return anglebetween end
-----------------------------------------------------------------
function vectorresult() function round(anglebetween, precision) return math.floor(anglebetween*math.pow(10,0)+0.5) / math.pow(10,0) end roundvector = round(anglebetween,precision) print("roundvector = "..roundvector) --quadrant 1 if airplane.x < vp.x , airplane.y < vp.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnleft1() airplane.rotation = airplane.rotation - 1 print("turn left1") end function turntimer1() --if airplane.rotation ~= airplanehdg + newvector turnlefttimer1 = timer.performwithdelay(500, turnleft1, newvector) --end end turntimer1() --end elseif airplane.x < vp.x , airplane.y < vp.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnright1() airplane.rotation = airplane.rotation + 1 print("turn right1") end function turntimer2() if airplane.rotation ~= 180 + newvector turnonerighttimer = timer.performwithdelay(500, turnright1,newvector) end end turntimer2() --quadrant 2 elseif airplane.x > vectorpoint.x , airplane.y < vectorpoint.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnleft2() airplane.rotation = airplane.rotation - 1 print("turn left2") end function turntimer3() if airplane.rotation ~= 180 - newvector turnonelefttimer = timer.performwithdelay(500, turnleft2, newvector) end end turntimer3() elseif airplane.x > vectorpoint.x , airplane.y < vectorpoint.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnright2() airplane.rotation = airplane.rotation + 1 print("turn right2") end function turntimer4() if airplane.rotation > 180 + newvector turnonerighttimer = timer.performwithdelay(500, turnright2, newvector) end end turntimer4() --quadrant 3 elseif airplane.x < vectorpoint.x , airplane.y > vectorpoint.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnleft3() airplane.rotation = airplane.rotation - 1 print("turn left3") end function turntimer5() if airplane.rotation < 180 - newvector turnonelefttimer = timer.performwithdelay(500, turnleft3, newvector) end end turntimer5() elseif airplane.x < vectorpoint.x , airplane.y > vectorpoint.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnright3() airplane.rotation = airplane.rotation + 1 print("turn right3") end function turntimer6() if airplane.rotation > 180 - newvector turnonerighttimer = timer.performwithdelay(500, turnright3, newvector) end end turntimer6() --quadrant 4 elseif airplane.x > vectorpoint.x , airplane.y > vectorpoint.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnright4() airplane.rotation = airplane.rotation + 1 print("turn right4") end function turntimer7() if airplane.rotation ~= newvector turntimer = timer.performwithdelay(500, turnright4, newvector) end end turntimer7() elseif airplane.x > vectorpoint.x , airplane.y > vectorpoint.y if roundvector < 90 newvector = 90 - roundvector + 90 print("newvector = "..newvector) elseif roundvector > 90 , roundvector < 180 newvector = 180 + roundvector print("newvector = "..newvector) elseif roundvector > 180 , newvector < 270 newvector = roundvector print("newvector = "..newvector) elseif roundvector > 270 newvector = 180 + roundvector print("newvector = "..newvector) end function turnleft4() airplane.rotation = airplane.rotation - 1 print("turn left4") end function turntimer8() if airplane.rotation ~= newvector turntimer = timer.performwithdelay(500, turnleft4, newvector) end end turntimer8() end end vectorresulttimer = timer.performwithdelay(800, vectorresult) function removevp() display.remove(vectorpoint) vectorpoint = nil airplane1da.isvisible = false timer.cancel(removevptimer) end removevptimer = timer.performwithdelay(1500, removevp) timer.performwithdelay(600, anglebetween) end function addeventvectorpoint() runtime:addeventlistener("tap", setvectorpoint) end vectorpointtimer = timer.performwithdelay(500, addeventvectorpoint) end
thanks or pointers in advance,
thanks code devfar looking around , happened find , perfect looking for. there 1 small thing, speed different depending on how far away tap. changed in code constant, if else need it, here go.
local w = display.contentwidth local h = display.contentheight local bg = display.newrect(0,0, w,h) local img = display.newimage("triangle.png")--make image arrow pointing right img.x = w/2 img.y = h/2 local getx local gety local travelflag = true local distancex local distancey local totaldistance function getimagerotation(x1,y1,x2,y2) local pi = 3.14159265358 local deltay = y2 - y1 local deltax = x2 - x1 local angleindegrees = (math.atan2( deltay, deltax) * 180 / pi)*-1 local mult = 10^0 return math.floor(angleindegrees * mult + 0.5) / mult end local function ontravel() distancex=img.x-getx distancey=img.y-gety print(distancex) print(distancey) totaldistance=(distancex*distancex)+(distancey*distancey) totaldistance=math.sqrt(totaldistance) print(totaldistance) local function flag() travelflag = true end if travelflag travelflag = false img.rotation = (getimagerotation(img.x,img.y,getx,gety))*-1 transition.to( img, { time=totaldistance*5, x=getx, y=gety, oncomplete=flag } ) end end local function ontap(event) if event.phase == "began" or event.phase == "moved" getx = event.x gety = event.y elseif event.phase == "ended" ontravel() end end runtime:addeventlistener("touch", ontap)
Comments
Post a Comment