【问题标题】:How can I make an object move across my screen gradually using a loop in Lua and Corona Labs SDK如何使用 Lua 和 Corona Labs SDK 中的循环使对象逐渐在屏幕上移动
【发布时间】:2015-10-11 03:14:45
【问题描述】:

我正在制作一个游戏,其中包含玩家必须跳过的障碍。我正在使用 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

非常感谢任何帮助。

【问题讨论】:

    标签: android loops lua crash coronasdk


    【解决方案1】:

    了解 Corona SDK 是一个事件驱动系统很重要。真的没有游戏循环。代码执行速度如此之快,以至于您无法使用循环之类的结构来移动内容。

    如上所述,过渡库(例如transition.to)可以随时间移动对象。

    最接近游戏循环的是创建一个函数并使用“enterFrame”事件将其附加到运行时对象。每一帧(每秒 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 )
    

    【讨论】:

      【解决方案2】:

      Corona SDK 提供了工具来做到这一点。不要使用循环,而是使用transition library

      transition.to(target, params)
      

      其中 target 是您的 障碍 对象,在参数中,您可以指定 x 位置、时间等。

      【讨论】:

      • 非常感谢。游戏的那部分已经完成。最后一点是得分。如果物体接触到某种颜色,有没有办法结束游戏?
      • 当然是@Mitra0000。不过,我建议为此提出一个新问题。
      【解决方案3】:

      关于屏幕上出现的位置可能有一些奇怪的来源。我将 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        相关资源
        最近更新 更多