Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 尝试调用方法“applyForce”(一个nil值)_Lua_Coronasdk - Fatal编程技术网

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

Lua 尝试调用方法“applyForce”(一个nil值),lua,coronasdk,Lua,Coronasdk,我得到: 尝试将方法“applyForce”调用为nil值 当我在屏幕上点击繁殖红鸟rBird后,rBirdJump内的对象将变为零,请在corona lua中解释 function spawnRBird( x,y ) print("\n entered into spawnred"); rBird = display.newSprite (sheet, seqData); rBird.x = x; rBird.y = y; rBird:setSequ

我得到:

尝试将方法“applyForce”调用为nil值

当我在屏幕上点击繁殖红鸟rBird后,rBirdJump内的对象将变为零,请在corona lua中解释

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 );

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


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

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

您可以将函数中的rBird初始化为局部变量,并对场景/当前文件使用局部变量,以避免使用全局变量。在物理中添加rBird后,将变量设置为rBird,这样跳转函数就不会返回错误。这还可以帮助您确保在将对象添加到物理引擎中后,正在使用用于显示对象的变量

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
通过在后面的代码中使用变量redBird,可以确保在物理中添加phusics对象后为其赋值时使用的是phusics对象

-- 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 );

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

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 )
physics.start();