尝试调用方法'applyForce'(一个空值)。

在生成红鸟rBird对象后,当我点击屏幕时,rBirdJump内部的rBird对象变成了空值,导致出现以下错误:

attempt to call method 'applyForce' (a nil value)

请在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
点赞
用户869951
用户869951

你确定 spawnRBird 在你触摸屏幕之前被调用了吗?而且消息表明 rBird 不为 nil,但 applyForce 不是 rBird 的一个方法。这意味着在 rBird 被生成后,可能已从物理环境中移除了它,或者从显示对象中也将其移除了(这不会使它变成 nil,但会删除其中的某些方法)。

如果这些并没有对你解决问题有帮助,那么你需要将整个文件发布出来,而不是仅发布部分内容。

2014-11-27 13:20:54
用户2260388
用户2260388

错误是因为在调用该函数时,rBird 不是一个物理对象。

在你的 spawnBird 函数中,你正在初始化 rBird 并将其添加到物理引擎中。你将 rBird 声明为全局变量。这通常是一种不好的编程实践,应该避免使用,因为它可能会导致大量的内存泄漏。

你可以在函数中将 rBird 初始化为局部变量,并使用一个局部变量指向场景/当前文件以避免使用全局变量。在你将它添加到物理引擎中后,将变量设置为与 rBird 相同,以确保你的跳跃函数不会返回错误。这也有助于确保在将变量添加到物理引擎后才使用它来显示对象。

- 将你创建的 redBird 进行前向引用。将其初始化为空以确保在添加到物理引擎后再分配一个值给这个变量。
local redBird = nil
function spawnRBird( x,y )
    print("\n entered into spawnred");
    -- 将 rBird 初始化为局部变量
    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,你可以确保你正在使用一个物理对象,因为你是在将其添加到物理引擎后给它分配一个值的。

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 )
2014-11-27 21:37:49
用户1528604
用户1528604

请确保您已启动物理引擎:

physics.start();
2016-02-18 22:48:16