使用Corona和Lua进行碰撞检测。

我遇到了一个问题,就是无法检测表格中所有对象的特定碰撞。只有当用雪球击中表格中的第一个对象时才能增加得分。这是我用于创建对象和碰撞的代码。按钮推动后,我调用了createSnowBall()函数。那部分工作很好。

local physics = require("physics")
physics.start()
physics.setGravity( 0, 0 )

local snowBalls = {}
local ornaments = {}
local score = 0

local scoreText = display.newText( "Score: " .. score, 70, 25, native.systemBoldFont, 32 )

function createSnowBall()
    snowBall = display.newImageRect( "snowball.png", 20, 20)
    snowBall.x = gun.x
    snowBall.y = HEIGHT - 110
    physics.addBody( snowBall, { density = 1.0, friction = 1, bounce = 0, radius = 20 } )
    snowBall.isSnowBall = true
    snowBalls[#snowBalls+1] = snowBall
    moveSnowBall(snowBall)
    return snowBall
end

function createOrnament(num)
        if num == 1 then
            ornament = display.newImageRect( "blueO.png", 30, 40)
        elseif num == 2 then
            ornament = display.newImageRect( "redO.png", 30, 40)
        elseif num == 3 then
            ornament = display.newImageRect( "greenO.png", 30, 40)
        end
    ornament.isOrnament = true
    ornaments[#ornaments+1] = ornament
    ornament.x = math.random(50, 270)
    ornament.y = 3
    local radius = 15
    physics.addBody( ornament, { density = 1.0, friction = 1, bounce = 1, radius = radius } )
    ornament:applyForce(35, 70, ornament.x + 4, ornament.y + 4)
    return ornament
end
createOrnament(math.random(1, 3))

function snowBallCollision(event)
    if event.phase == "began" then
        local target = event.other
            if target.isSnowBall then
                score = score + 5
                scoreText.text = "Score: " .. score
            end
    end
end

ornament:addEventListener( "collision", snowBallCollision )
点赞
用户1979583
用户1979583

这个问题是由下面这行代码造成的:

ornament:addEventListener( "collision", snowBallCollision )

这里你只给对象添加一次监听器,而它只会赋值给之前已生成但还未被销毁的对象。

所以,从代码中删除那一行,并在每次调用下面这行代码时:

createOrnament(math.random(1, 3))

替换为:

local myOrnament = createOrnament(math.random(1, 3)) --因为'createOrnament'返回对象
myOrnament:addEventListener( "collision", snowBallCollision ) -- 给新创建的对象赋值监听器

这将给所有 'myOrnament' 对象分配监听器。

继续编码…… :)

2014-12-11 20:07:39