我如何使用Lua和Corona Labs SDK中的循环让对象逐渐在屏幕上移动



我正在制作一款带有玩家必须跳过的障碍的游戏。我使用Corona Labs Simulator来运行它,但每次我这么做的时候,要么障碍会在屏幕上出现一半,然后立即停止,要么整个游戏崩溃。下面是我的代码:

    function obstacles()
        loop = 2000
        while loop > 0 do
            obstacle:translate( -1, 0 )
            if obstacle.x > 0 then
                loop = loop - 1
            else
                loop = 2000
                obstacle:translate( display.contentWidth, 0 )
            end
        end
    end

非常感谢。

了解Corona SDK是一个事件驱动系统很重要。这里并不存在真正的游戏循环。代码执行得如此之快,你不能使用循环这样的结构来移动东西。

如上所述,转换库(transition。To(例如)可以随时间移动一个对象。

最接近游戏循环的是创建一个函数,并使用"enterFrame"事件将其附加到Runtime对象。每帧(每秒30次或每秒60次),这个函数将被调用。它不会精确到每秒30或60次因为它会花费太多时间做其他的工作来给你完整的帧速率。如果你想使用enterFrame监听器:

local function doSomethingEachFrame( event )
    -- put code here you want to execute over time.
    -- just remember it fires a lot...
end
Runtime:addEventListener( "enterFrame", doSomethingEachFrame )

如果你需要停止它,那么你可以这样做:

Runtime:removeEventListener( "enterFrame", doSomethingEachFrame )

Corona SDK提供了这样做的工具。与其使用循环,不如使用转换库:

transition.to(target, params)

其中目标是你的障碍对象,在参数中,你可以指定x位置,时间等

关于屏幕上出现的东西的位置可能会有一些奇怪的来源。我把obstacle放在(0,0),根本没有移动,并确保我理解父节点的坐标系统,以及obstacleanchorXanchorY,然后再尝试动画。

我假设在您包含的块之外还有其他代码,但我认为您可以使移动逻辑更简单,稍后您会感谢自己(这不是完美的,但您得到的想法):

-- set initial position
obstacle.x = display.contentWidth
-- define per-frame movement logic
local moveObstacle = function(event)
    obstacle.x = obstacle.x - 1
    if obstacle.x < 0 then
        obstacle.x = display.contentWidth
    end
end
-- run that logic once every frame
Runtime:addEventListener("enterFrame", moveObstacle)

最新更新