【问题标题】:Corona SDK: Moving a player Up and DownCorona SDK:上下移动玩家
【发布时间】:2014-03-02 10:48:17
【问题描述】:

我有一个在太空中航行的玩家。因为它是空间,所以没有重力,因此没有抛物线轨迹。玩家只是从左到右沿着一条水平线前进。玩家实际上并没有在移动,但背景在移动,所以看起来他在移动。 x 值是固定的。

我有 2 个按钮可以帮助玩家避开小行星等障碍物。一个按钮给玩家向上的力量,另一个给玩家向下的力量。以下是按下这些按钮时调用的函数。

函数 moveUp( 事件 ) 如果 event.phase == "结束" 那么
            player:applyForce(0, 8, player.x, player.y)
            player:setSequence("jump")
            jumpChannel = audio.play(jumpSound)
        end
    return true
end

函数 moveDown( 事件 ) 如果 event.phase == "结束" 那么

player:applyForce(0, -8, player.x, player.y) player:setSequence("jump") jumpChannel = audio.play(jumpSound) end return true end

这个实现的问题在于,每当施加一个力时,玩家就会一直朝那个方向前进。然后你必须向相反的方向施加力,他将永远朝着那个方向前进。那不是我想要的。我想要的是:

  • 当按下 UP 时,玩家会在 Y 方向上升一定的值(例如 50 像素)。然后玩家会在新高度从左到右继续水平方向。

  • 当按下 DOWN 时,播放器会下降某个值。然后玩家在新的高度继续从左到右水平方向前进。

实现这一目标的最佳方法是什么?我可以使用 applyForce 函数执行此操作还是有其他方法?提前感谢您的宝贵时间!

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    您必须记住 F=ma:如果施加的力为 0,则 a 为 0,这意味着速度不会改变。你有两个选择:

    1. 施加相反的力会降低速度,并在速度为 0 时停止。每个 Body 都有 myBody.linearDamping 因子,您可以将其设置为非零。如果这不起作用,你可以应用你自己的阻尼:你让它与身体速度成正比,所以你需要一个 enterFrame 事件处理程序来根据当前速度更新力:

      function enterFrame(e)
          local v = player:getLinearVelocity()
          player:applyForce(- a * v)
      end
      

      这里的“a”是阻尼,一个任意的数字(0 是你现在拥有的;它越大,玩家返回 0 速度的速度越快)。我还没有检查 applyForce() 是加法(添加到现有的力量)还是绝对的(替换现有的)。但你明白了。

    2. 直接移动玩家:

      function moveUp( event )
          if event.phase == "ended" then
              player:setLinearVelocity(0, 8) -- pixels/sec
      

      您仍然需要一个 enterFrame 处理程序来监控位置,并在达到所需位置时设置线性速度(0,0)。

    使用选项 1,您将获得更流畅、更“逼真”的动作。

    【讨论】:

    • 用力总是更流畅,更逼真。线性阻尼因子的作用就像魅力一样。谢谢老哥,真的很感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多