我正在制作一款带有玩家必须跳过的障碍的游戏。我使用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),根本没有移动,并确保我理解父节点的坐标系统,以及obstacle
的anchorX
和anchorY
,然后再尝试动画。
我假设在您包含的块之外还有其他代码,但我认为您可以使移动逻辑更简单,稍后您会感谢自己(这不是完美的,但您得到的想法):
-- 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)