尝试调用方法' applyForce' (零值)

时间:2014-11-27 03:16:47

标签: lua corona

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对象后点击屏幕变为零时请在电晕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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

发生错误是因为 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 )

答案 2 :(得分:0)

确保你已经开始了物理学:

physics.start();