Lua 尝试调用方法“applyForce”(一个nil值)
我得到: 尝试将方法“applyForce”调用为nil值 当我在屏幕上点击繁殖红鸟rBird后,rBirdJump内的对象将变为零,请在corona lua中解释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
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();