繁体   English   中英

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

[英]attempt to call method 'applyForce' (a nil value)

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”(nil值)

当我在屏幕上点击产卵红鸟后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

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

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

发生错误的原因是,调用函数时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 ) 

确保您已开始物理:

physics.start();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM