1

我对编程很陌生,但我很享受通过反复试验来学习 Corona(主要是错误!)

我正在为一个大学项目创建一个空中交通控制模拟程序,并且在如何让一个物体(雷达上的飞机)转向并前往一个水龙头点时遇到了障碍。

我正在使用以下代码来移动飞机:

local function moveAirplane1(event)

function cleanAirplaneRuntime()
Runtime:removeEventListener("enterFrame", moveAirplane1)
end

if Airplane1OnRadar == false then
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)   

这很好用,我可以通过添加或减去 plane.rotation 值来控制方向。然而,我想做的是让玩家点击屏幕,让飞机旋转并飞到那个点。

我一直在尝试计算分接点和飞机之间的角度,然后通过差值旋转飞机,但是根据飞机所在的象限以及分接点相对于飞机的象限,有很多排列我想知道我是否走在正确的轨道上,或者是否有一种我想念的简单方法来做到这一点?

这是我一直在尝试的(抱歉,啰嗦了)

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 and 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 and airplane.y < vP.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            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 then
                turnLeftTimer1 = timer.performWithDelay(500, turnLeft1, newVector)
                --end
            end 
            turnTimer1()
        --end   
    elseif airplane.x < vP.x and airplane.y < vP.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            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 then
                turnOneRightTimer = timer.performWithDelay(500, turnRight1,newVector)
                end
            end
            turnTimer2()

--Quadrant 2    

    elseif airplane.x > vectorPoint.x and airplane.y < vectorPoint.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            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 then
                turnOneLeftTimer = timer.performWithDelay(500, turnLeft2, newVector)
                end
            end 
            turnTimer3()

    elseif airplane.x > vectorPoint.x and airplane.y < vectorPoint.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            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 then
                turnOneRightTimer = timer.performWithDelay(500, turnRight2, newVector)
                end
            end
            turnTimer4()

--Quadrant 3

    elseif airplane.x < vectorPoint.x and airplane.y > vectorPoint.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            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 then
                turnOneLeftTimer = timer.performWithDelay(500, turnLeft3, newVector)
                end
            end
            turnTimer5()    

    elseif airplane.x < vectorPoint.x and airplane.y > vectorPoint.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            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 then
                turnOneRightTimer = timer.performWithDelay(500, turnRight3, newVector)
                end
            end
            turnTimer6()

--Quadrant 4

    elseif airplane.x > vectorPoint.x and airplane.y > vectorPoint.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        end 

            function turnRight4()
            airplane.rotation = airplane.rotation + 1
            print("Turn Right4")
            end

            function turnTimer7()
                if airplane.rotation ~= newVector then
                turnTimer = timer.performWithDelay(500, turnRight4, newVector)
                end
            end
            turnTimer7()    

    elseif airplane.x > vectorPoint.x and airplane.y > vectorPoint.y then

        if roundVector < 90 then
            newVector = 90 - roundVector + 90
            print("newVector = "..newVector)
        elseif
            roundVector > 90 and roundVector < 180 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 180 and newVector < 270 then
            newVector = roundVector
            print("newVector = "..newVector)
        elseif
            roundVector > 270 then
            newVector = 180 + roundVector
            print("newVector = "..newVector)
        end 

            function turnLeft4()
            airplane.rotation = airplane.rotation - 1
            print("Turn Left4")
            end

            function turnTimer8()
                if airplane.rotation ~= newVector then
                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

感谢您提前提供任何帮助或指示,

4

2 回答 2

2

Thanks for the code DevfaR I was looking around and happened to find this and it is almost perfect for what I was looking for. There was just one small thing, the speed is different depending on how far away you tap. I changed in the code for it to always be constant, so if anyone else need it, here you go.

local W = display.contentWidth
local H = display.contentHeight


local bg = display.newRect(0,0, W,H)
local img = display.newImage("triangle.png")--make an image arrow pointing to the 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 then
        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" then
        getX = event.x
        getY = event.y

    elseif event.phase == "ended" then

        onTravel()
    end

end
Runtime:addEventListener("touch", onTap)
于 2013-09-03T09:43:05.500 回答
0

我已经创建了一些指针供您使用触摸侦听器进行参考。当您触摸到屏幕上的特定位置然后松开手指时,就会发生过渡。您可以复制此代码并创建新项目以查看其工作原理。

这是代码

local W = display.contentWidth
local H = display.contentHeight


local bg = display.newRect(0,0, W,H)
local img = display.newImage("triangle.png")--make an image arrow pointing to the right
img.x = W/2
img.y = H/2

local getX
local getY
local travelFlag = true


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()

    local function Flag()
        travelFlag = true
    end

    if travelFlag then
        travelFlag = false
        img.rotation = (getImageRotation(img.x,img.y,getX,getY))*-1
        transition.to( img, { time=2000, x=getX, y=getY, onComplete=Flag } )
    end
end

local function onTap(event)

    if event.phase == "began" or event.phase == "moved" then
        getX = event.x
        getY = event.y

    elseif event.phase == "ended" then

        onTravel()
    end

end
Runtime:addEventListener("touch", onTap)
于 2013-07-18T13:08:15.837 回答