Lua编程。尝试索引本地“self”(值为空),堆栈追踪:

问题出在函数名“bullet Collision” 我无法在碰撞后移除子弹。如果删除self:removeSelf()这行代码,则代码运行。错误显示在子弹与敌人碰撞后。

--物理世界创建

local物理学=需要(“物理学”)
物理学开始()
物理学setGravity(1,1--屏幕
local宽度=display.contentWidth
local高度=display.contentHeight

--游戏角色
local敌人
local英雄
local子弹
local背景
local分数
local计数器

--背景
背景=显示。newImage(“night_sky.png”,宽度/2,高度/2true--碰撞过滤器
local heroCollisionFilter = { categoryBits=1, maskBits=2 }
local enemyCollisionFilter = { categoryBits=2, maskBits=7 }
local bulletCollisionFilter = { categoryBits=4, maskBits=2 }

--英雄的死亡
function heroCollision(event)
end

--子弹发热
function bulletCollision(event, self)
    print(“子弹碰撞”)
    if event.other.name == “enemy” then
        self:removeSelf()
        event.other:removeSelf()
        event.other= nil

    end

end

--火
function fireBullet(event)
    bullet=显示。newImage(“bullet.png”,英雄.x,英雄.y)
    物理学。addBody(子弹,{filter=bulletCollisionFilter})
    bullet.name=bullet
    local gx = event.x-bullet.x
    local gy = event.y-bullet.y
    物理学。setGravity(gx / 10,gy / 10)
    bullet.collision= bulletCollision
    bullet:addEventListener(“collision”, bulletCollision)

end

function addEnemy()

    local敌人=显示。newImage(“ball.png”,40,50)
    物理学。addBody(敌人,{filter=enemyCollisionFilter})
    enemy.gravityScale=0
    敌人:addEventListener(“tap”,fireBullet)
    敌人.name= “enemy”
end

addEnemy()

背景:addEventListener(“tap”, fireBullet)

英雄=显示。newImage(“pearl1.png”,宽度/2,高度/2true
点赞
用户1266551
用户1266551

你没有正确设置碰撞。

  1. bullet.collision 已正确设置为碰撞函数 bulletCollision,但你没有正确设置事件监听器。你应该执行 bullet:addEventListener("collision", bullet) 而不是 bullet:addEventListener("collision", bulletCollision)
  2. “collision” 事件的监听器函数中参数的顺序被调换了。应该是 (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
2016-04-20 09:59:50
用户4327598
用户4327598

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

if xxx ~= nil then
    xxx:removeSelf()
    xxx = nil
end
2016-04-24 10:35:11