【问题标题】:attempt to call method 'applyForce' (a nil value)尝试调用方法“applyForce”(零值)
【发布时间】:2015-01-25 13:40:34
【问题描述】:
function spawnRBird( x,y )  
    print("\n entered into spawnred");
    rBird = display.newSprite (sheet, seqData);
    rBird.x = x;
    rBird.y = y;
    rBird:setSequence("rBird")
    rBird.anchorX = 0;
    rBird.anchorY = 1;
    physics.addBody(rBird, "dynamic", {density=1, bounce=0.5, friction=0.5})
    rBird:play();
    rBird:addEventListener( "collision", birdCollision );

我得到:

尝试调用方法“applyForce”(一个零值)

当我在生成红色鸟rBird rBirdJump 内的对象后单击屏幕时变为nil 请在corona lua中解释

function rBirdJump( event )
    if (event.phase == "began") then
            rBird:applyForce(0, -50, redBird.x, redBird.y)
            rBird:setLinearVelocity( 0, -10 )
            rBird.isFixedRotation = true;
    end
end
Runtime:addEventListener("touch", rBirdJump);
--timer.performWithDelay( 1000, function Runtime:addEventListener("touch", rBirdJump) end, 1 )
end

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    你知道在你触摸屏幕之前spawnRBird 被调用了吗?该消息还表明rBird 不是零,但applyForce 不是rBird 上的方法。这意味着 rBird 在生成后已从物理中移除,或者作为显示对象移除(这不会使其为零,只是从中移除某些方法)。

    如果这不能帮助您找到问题,您将不得不按原样发布文件,而不仅仅是部分。

    【讨论】:

      【解决方案2】:

      发生错误是因为调用函数时 rBird 不是物理对象。
      在您的 spawnBird 函数中,您正在初始化 rBird 并将其添加到物理中。您将 rBird 声明为全局变量。这通常是一种不好的编程习惯,不应该进行调整,因为它可能会导致严重的内存泄漏。

      您可以在函数中将 rBird 初始化为局部变量,并使用场景/当前文件的局部变量来避免使用全局变量。将变量添加到物理中后将其设置为与 rBird 相同,这样您的跳转函数就不会返回错误。这也将帮助您确保在将显示对象的变量添加到物理引擎后正在使用它。
      -- forward reference to your created redBird. Initialize as nil to make sure the variable is assigned a value after its added in physics.
      local redBird = nil
      function spawnRBird( x,y )  
          print("\n entered into spawnred");
          local rBird = display.newSprite (sheet, seqData);
          rBird.x = x;
          rBird.y = y;
          rBird:setSequence("rBird")
          rBird.anchorX = 0;
          rBird.anchorY = 1;
          physics.addBody(rBird, "dynamic", {density=1, bounce=0.5, friction=0.5})
          redBird = rBird
          rBird:play();
          rBird:addEventListener( "collision", birdCollision );
      

      通过在后面的代码中使用变量 redBird,您可以确保您使用的是 phusics 对象,因为您在将其添加到物理中后为其分配了一个值。

      function rBirdJump( event )
          if (event.phase == "began" and redBird ~= nil) then
              redBird:applyForce(0, -50, redBird.x, redBird.y)
              redBird:setLinearVelocity( 0, -10 )
              redBird.isFixedRotation = true;
          end
      end
      Runtime:addEventListener("touch", rBirdJump);
      --timer.performWithDelay( 1000, function Runtime:addEventListener("touch", rBirdJump) end, 1 )
      

      【讨论】:

        【解决方案3】:

        确保你已经开始物理:

        physics.start();
        

        【讨论】:

          猜你喜欢
          • 2019-02-05
          • 2021-06-07
          • 1970-01-01
          • 1970-01-01
          • 2019-01-06
          • 2017-03-30
          • 2015-06-15
          • 2016-10-26
          • 2011-07-31
          相关资源
          最近更新 更多