Search code examples
luacoronasdkcollision

Lua Create multiple collisions


I'm trying to create a break breaker game that contains brinks that can be hit twice before the disappear.

I have tried:

 --FOR STRONGER DEFENDERS
        for i = 1, len do
            for j = 1, level_W do
                if(level[i][j] == 2) then               
                    local strong = display.newImage('images/strongdefender.png')
                    strong.name = 'strong'
                    strong.x = def_W * j - offset
                    strong.y = def_H * i
                    physics.addBody(strong, {density = 1, friction = 0, bounce = 0})
                    strong.bodyType = 'static'
                    strongs.insert(strongs, strong)
                end
            end
        end
        for i = 1, len do
            for j = 1, level_W do
                if(level[i][j] == 2) then
                local defender = display.newImage('images/defender.png')
                    defender.name = 'defender'
                    defender.x = def_W * j - offset
                    defender.y = def_H * i
                    physics.addBody(defender, {density = 1, friction = 0, bounce = 0})
                    defender.bodyType = 'static'                    
                end
            end
        end

level is a table which is filled with 0 and 2. 2 is where the defender image will be in the game.

My collision event is like so:

function onCollision(e)


        if(e.other.name == 'defender' or e.other.name == 'strong' and (ball.x + ball.width * 0.5) < (e.other.x + e.other.width * 0.5)) then
            xSpeed = -5
        elseif(e.other.name == 'defender' or e.other.name == 'strong' and (ball.x + ball.width * 0.5) >= (e.other.x + e.other.width * 0.5)) then
            xSpeed = 5
        end

        if(e.other.name == 'defender') then
            audio.play(defencePop)
            ySpeed = ySpeed * -1
            e.other:removeSelf()
            e.other = nil
            defenders.numChildren = defenders.numChildren - 1

            --SORT SCORE
            score = score + 1
            scoreNum.text = score * points
            scoreNum:setReferencePoint(display.CenterLeftReferencePoint)
            scoreNum.x = 54 
        elseif(e.other.name == 'strong') then
            audio.play(defencePop)
            ySpeed = ySpeed * -1
            e.other:removeSelf()
            e.other = nil
            defenders.numChildren = defenders.numChildren - 1

            --SORT SCORE
            score = score + 1
            scoreNum.text = score * points
            scoreNum:setReferencePoint(display.CenterLeftReferencePoint)
            scoreNum.x = 54     

        end




        --defenders.numChildren < 0
        if(strongs.numChildren < 0) then
            bgAlert('win')
            gameStatus = 'win'
        end
    end -- removeDefender

When the ball collides with the element, both of them disappear. How can I make one disappear at a time?


Solution

  • I would suggest you just put the strong on the screen and add an event listener to them the weaker brick is created when the collision occurs with the stronger brick. The idea is to remove the object and add a new one when the collision occurs.
    First you would display the strong object and add them to physics. You would also add a local collision event listener to the object

     for i = 1, len do
         for j = 1, level_W do
             if(level[i][j] == 2) then               
                 local strong = display.newImage('images/strongdefender.png')
                 strong.name = 'strong'
                 strong.x = def_W * j - offset
                 strong.y = def_H * i
                 physics.addBody(strong, {density = 1, friction = 0, bounce = 0})
                 strong.bodyType = 'static'
                 strong.collision = onBrickCollision --onStrongCollision is the name of the collision handler function
                 strong:addEventListener("collision" , strong) --add collision listener
                 strongs.insert(strongs, strong)
             end
         end 
     end
    

    The event listener would be like

    function onBrickCollision(self , event)
    if event.phase == "began" and event.other.name == "ball" then
        if (ball.x + ball.width * 0.5) < (self.x + self.width * 0.5) then
            xSpeed = -5
        else
            xSpeed = 5
        end
        if self.name == "strong" then
            audio.play(defencePop)
            ySpeed = ySpeed * -1
            --Create defender on the position of strong and add it to physics
            local defender = display.newImage('images/defender.png')
            defender.name = 'defender'
            set the position same as the object which is hit by ball
            defender.x = self.x
            defender.y = self.y
            physics.addBody(defender, {density = 1, friction = 0, bounce = 0})
            defender.bodyType = 'static'
            defender.collision = onBrickCollision
            defender:addEventListener("collision", defender)
            --remove the strong brick
            self:removeSelf()
            self = nil
    
            --SORT SCORE
            score = score + 1
            scoreNum.text = score * points
            scoreNum:setReferencePoint(display.CenterLeftReferencePoint)
            scoreNum.x = 54     
    
        elseif self.name == "defender" then
            audio.play(defencePop)
            ySpeed = ySpeed * -1
            self:removeSelf()
            self = nil
            defenders.numChildren = defenders.numChildren - 1
    
            --SORT SCORE
            score = score + 1
            scoreNum.text = score * points
            scoreNum:setReferencePoint(display.CenterLeftReferencePoint)
            scoreNum.x = 54 
        end
    end
    

    Hope the code is self explanatory :)
    Feel free to ask me if you have any further questions.