Обнаружение столкновений Corona SDK не работает - PullRequest
0 голосов
/ 14 августа 2011

У меня есть (рабочая) функция, которая генерирует пули:

local function shootBullets ( event ) -- It's called through a timer
    local bullet = display.newImageRect("images/Bullet.png", 12, 12) --Make a bullet


    local convertedGunRotation = tankGun.rotation*(math.pi/180) --Don't worry about this just some math for figure out where to shoot the bullet
    local orientation = math.pi

    bullet.x = tankBody.x
    bullet.y = tankBody.y

    physics.addBody(bullet, "kinematic", {bounce = 0}) --Make it a body so I can give it a velocity with the function setLinearVelocity
    bullets:insert( bullet ) --Add it to my bullets group

    bullet.name = "bullet" --Used later for collision detection
    bullet.collision = onCollision --These two lines are what I am doing for collision, isn't working.
    bullet:addEventListener("collision", bullet)


    --This is how I am moving the bullet
    bullet:setLinearVelocity(0*math.cos(convertedGunRotation+orientation)-100*math.sin(convertedGunRotation+orientation), 0*math.sin(convertedGunRotation+orientation)+100*math.cos(convertedGunRotation+orientation))
end

И у меня есть 4 прямоугольника, которые окружают экран:

local leftWall = display.newRect(0, 0, 10, _H) --Make the rectangle
leftWall.strokeWidth = 3 --Give its edges a width
leftWall:setFillColor(192, 255, 255) --Fill it with a color to make it visible
leftWall:setStrokeColor(192, 255, 255)
leftWall.name = "wall" --Give it a name for reference in collision detection 
physics.addBody( leftWall, "static") --Make sure it can't move and make it a body.

--Same hold true for the other 3 walls, they surround the player so you can't not hit one with a bullet.
local rightWall = display.newRect(_W-10, 0, 10, _H)
rightWall.strokeWidth = 3
rightWall:setFillColor(192, 255, 255)
rightWall:setStrokeColor(192, 255, 255)
rightWall.name = "wall"
physics.addBody( rightWall, "static")

local bottomWall = display.newRect(0, _H-10, _W, 10)
bottomWall.strokeWidth = 3
bottomWall:setFillColor(192, 255, 255)
bottomWall:setStrokeColor(192, 255, 255)
bottomWall.name = "wall"
physics.addBody( bottomWall, "static")

local topWall = display.newRect(0, 0, _W, 10)
topWall.strokeWidth = 3
topWall:setFillColor(192, 255, 255)
topWall:setStrokeColor(192, 255, 255)
topWall.name = "wall"
physics.addBody( topWall, "static")

И функция обнаружения столкновений:

local function onCollision( event )
    print("Here") -- Never gets here.
    -- Bullet hit something
    if event.object1.name == "bullet" then
        if event.object2.name == "enemy" then -- I'm going to worry about enemies later
                    --I will do stuff later
        elseif event.object2.name == "wall" then -- It should be hitting a wall
                    --TODO
        end
    end
end

Но функция print("Here") даже не вызывается в функции onCollision, когда я запускаю ее в терминале Corona. Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Что ж, решение, которое я в итоге использовал (и учтите, что это сработает, только если ваша игра не имеет гравитации), состоит в том, что я сделал пулю "dynamic", когда добавил ее тело в физику и ее свойство isSensorравно верноЭто почему-то сработало для меня.Но я все равно оставлю это открытым, пока кто-нибудь не найдет лучший ответ (тот, который отлично работает с пулей, обладающей свойством "kinematic". (Работало для меня, хотя ...)

1 голос
/ 14 августа 2011

Проверьте это:

http://developer.anscamobile.com/reference/index/physicsaddbody

В комментариях говорят:

Примечание. Этот API не следует использовать в обработчике событий Collision.

Удачи =)

...