Lua programming.try to index local 'self' (a nil value) ,stack traceback:



问题出在函数名称"子弹碰撞"上)碰撞后无法取出子弹。如果删除了 self:removeSelf() 行,则代码将运行。该错误在子弹与敌人碰撞后立即显示。

--Physics world creation
local physics = require ("physics")
physics.start()
physics.setGravity(1,1)
--screen
local width=display.contentWidth
local height=display.contentHeight
--game characters
local enemy
local hero
local bullet
local background
local score
local counter
--backGround
background= display.newImage("night_sky.png",width/2,height/2,true)

--collision filters
local heroCollisionFilter = { categoryBits=1, maskBits=2 }
local enemyCollisionFilter = { categoryBits=2, maskBits=7 }
local bulletCollisionFilter = { categoryBits=4, maskBits=2 }


--hero's death
function heroCollision(event)
end
--bullet heat
function bulletCollision(event, self)
    print("bullet collided")
    if event.other.name == "enemy" then
        self:removeSelf()
        event.other:removeSelf()
        event.other= nil
    end

end


--fire
function fireBullet(event)
    bullet=display.newImage("bullet.png",hero.x,hero.y )
    physics.addBody(bullet,{filter=bulletCollisionFilter})
    bullet.name=bullet
    local gx = event.x-bullet.x
    local gy = event.y-bullet.y
    physics.setGravity(gx/10,gy/10)
    bullet.collision= bulletCollision
    bullet:addEventListener("collision", bulletCollision)
end

function addEnemy()
    local enemy = display.newImage("ball.png",40,50)
    physics.addBody(enemy,{filter=enemyCollisionFilter})
    enemy.gravityScale=0
    enemy:addEventListener("tap",fireBullet)
    enemy.name= "enemy"
end
addEnemy()


background:addEventListener("tap", fireBullet)
hero = display.newImage("pearl1.png",width/2,height/2,true)

您没有正确设置碰撞。

  1. bullet.collision已正确设置为冲突函数bulletCollision但未正确设置事件侦听器。你应该做bullet:addEventListener("collision", bullet)而不是bullet:addEventListener("collision", bulletCollision)
  2. "碰撞"事件的事件侦听器函数切换了参数的顺序。它应该是(self, event)的,而不是(event, self)

全部根据碰撞文档。

function bulletCollision(self, event)
    print("bullet collided")
    if event.other.name == "enemy" then
        self:removeSelf()
        event.other:removeSelf()
        event.other= nil
    end
end
function fireBullet(event)
    bullet=display.newImage("bullet.png",hero.x,hero.y )
    physics.addBody(bullet,{filter=bulletCollisionFilter})
    bullet.name=bullet
    local gx = event.x-bullet.x
    local gy = event.y-bullet.y
    physics.setGravity(gx/10,gy/10)
    bullet.collision= bulletCollision
    bullet:addEventListener("collision", bullet)
end

在删除之前,您需要每次检查显示对象是否为空,例如:

if xxx ~= nil then
    xxx:removeSelf()
    xxx = nil
end

最新更新