0
votes

I have a (working) function that is generating bullets:

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

And I have 4 rectangles that surround the screen:

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")

And a collision detection function:

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

But, the print("Here") function isn't even being called in onCollision function when I run it in Corona Terminal. Any help would be appreciated.

2

2 Answers

2
votes

Well, the solution I ended up using (and note this will only work if your game doesn't have any gravity) is that I made the bullet "dynamic" when I added it's body to physics and its isSensor property equal true. That for some reason worked for me. But I will still leave this open till someone finds a better answer (one that works fine with a bullet which has the property of "kinematic". (Worked for me though...)

1
votes

Check this:

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

At remarks they say:

Note: This API should not be used in a Collision Event handler.

Good luck =)