Collision

When I tap on attack button attackHitbox appears. If attackHitbox collides with zombie for some reason value hero.hp is going down… How to fix it?

Hero.hp value do only go down when hero collides with zombie.

[lua]

local composer = require “composer”

local joystickPlugin = require “plugin.joystick”

local physics = require “physics”

local scene = composer.newScene();

function scene:create(event)

    physics.start()

    physics.setGravity(0,0)

    local sceneGroup = self.view;

    system.activate(“multitouch”)

    local spaceBackground = display.newImageRect(“Images/SpaceBackground.png”,

    display.actualContentWidth, display.actualContentHeight)

    spaceBackground.x = display.contentCenterX

    spaceBackground.y = display.contentCenterY

    local loading = display.newText(“Loading…”, display.contentCenterX - 230, 330,

    “Lobster-Regular”, 40)

    local map = display.newImage(“Images/survivalModeMap.png”)

    map.isVisible = false

    map.x = display.contentCenterX

    map.y = display.contentCenterY

    local hero = display.newImage(“Images/mehaHat.png”)

    hero.isVisible = false

    hero.x = display.contentCenterX

    hero.y = display.contentCenterY

    physics.addBody(hero,“static”)

    hero.direction = “up”

    hero.hp = 100

    local hp = display.newText("Hp: "…hero.hp,display.contentCenterX,300,

    “Lobster-Regular”, 50)

    local zombie = display.newImage(“Images/zombie.jpg”)

    zombie.isVisible = false

    zombie.x = display.contentCenterX

    physics.addBody(zombie,“dynamic”)

    zombie.y = -100

    zombie.hp = 10

    zombie.phase = “ended”

    function zombieCollision(self, event)

      if event.phase == “began” then

        zombie.phase = “touching”

        timer.performWithDelay( 1, function()

        local function damage()

          if zombie.phase == “touching” then

            if hero.hp > 0 then

              hero.hp = hero.hp - 10

              hp.text = "Hp: "…hero.hp

            end

          end

        end

        timer.performWithDelay(1000,damage,-1)

        end)

      elseif event.phase == “ended” then

        zombie.phase = “ended”

      end

    end

    zombie.collision = zombieCollision

    local AttackButton = display.newImage(“Images/mehaAttackButton.png”)

    AttackButton.isVisible = false

    AttackButton.x = 480

    AttackButton.y = 270

    local AttackAnimationSheetData = {

      width = 400,

      height = 400,

      numFrames = 10,

      sheetContentWidth = 800,

      sheetContentHeight = 2000

    }

    local AttackAnimationSheet = graphics.newImageSheet(“Images/mehaAttackAnimation.png”, AttackAnimationSheetData)

    local sequenceData = {

      { name = “Attack”, start = 1, count = 10, time = 500, loopCount = 1}

    }

    local props = {

      x = 10,

      y = 270,

      backgroundRadius = 50,

      movedStickRadius = 25,

    }

    function loadingEnd()

      spaceBackground.isVisible = false

      loading.isVisible = false

      map.isVisible = true

      hero.isVisible = true

      zombie.isVisible = true

      AttackButton.isVisible = true

    end

      local Joystick = joystickPlugin.newJoystick(props)

      Joystick.background:setFillColor(0.5)

      Joystick.movedStick:setFillColor(0.7)

      function enterFrame(event)

        if Joystick.isActivated() then

          local vector = Joystick.getVector()

          if vector.x < -0.5 then

            map.x = map.x + 2

            zombie.x = zombie.x + 2

            hero.rotation = 270

            hero.direction = “left”

          elseif vector.x > 0.5 then

            map.x = map.x - 2

            zombie.x = zombie.x -2

            hero.rotation = 90

            hero.direction = “right”

          end

          if vector.y < -0.5 then

            map.y = map.y + 2

            zombie.y = zombie.y + 2

            hero.rotation = 0

            hero.direction = “up”

          elseif vector.y > 0.5 then

            map.y = map.y - 2

            zombie.y = zombie.y-2

            hero.rotation = 180

            hero.direction = “down”

          end

        end

      end

      local AttackCoolDown = 0

      function Attack(event)

        if(event.phase == “began”) then

          if AttackCoolDown == 0 then

            hero.isVisible = false

            local attackHitbox = display.newRect( display.contentCenterX, display.contentCenterY, 100, 90 )

            timer.performWithDelay( 200, function()

              physics.addBody(attackHitbox,“static”)

            end)

            local mehaAttackAnimation = display.newSprite( AttackAnimationSheet, sequenceData )

            mehaAttackAnimation.x = display.contentCenterX

            mehaAttackAnimation.y = display.contentCenterY

            if hero.direction == “up” then

              mehaAttackAnimation.rotation = 0

              attackHitbox.x = display.contentCenterX

              attackHitbox.y = display.contentCenterY - 100

              attackHitbox.rotation = 180

            elseif hero.direction == “right” then

              mehaAttackAnimation.rotation = 90

            elseif hero.direction == “down” then

              mehaAttackAnimation.rotation = 180

            elseif hero.direction == “left” then

              mehaAttackAnimation.rotation = 270

            end

            mehaAttackAnimation:play()

            AttackCoolDown = 1

            timer.performWithDelay( 500, function()

            hero.isVisible = true

            physics.removeBody(attackHitbox)

            attackHitbox:removeSelf()

              mehaAttackAnimation:removeSelf()

              AttackCoolDown = 0

            end)

          end

        end

      end

      function hpDetection(event)

        if hero.hp == 0 then

          composer.removeScene( “scenes.survival_gamemode” )

        end

      end

    timer.performWithDelay( 2000, loadingEnd )

    function enemy()

      if zombie.x < display.contentCenterX then

        zombie.x = zombie.x + 1

      end

      if zombie.y > display.contentCenterY then

        zombie.y = zombie.y - 1

      end

      if zombie.x > display.contentCenterX then

        zombie.x = zombie.x - 1

      end

      if zombie.y < display.contentCenterY then

        zombie.y = zombie.y + 1

      end

      zombie.rotation = 90 + math.deg(math.atan2(zombie.y - hero.y, zombie.x - hero.x))

      end

      --Runtime:addEventListener(“enterFrame”, enemy); --(I did this for testing)

      Runtime:addEventListener(“enterFrame”, hpDetection);

      AttackButton:addEventListener(“touch”, Attack);

      zombie:addEventListener(“collision”, zombie);

      Runtime:addEventListener(“enterFrame”, enterFrame)

end

function scene:destroy(event)

  physics.stop()

  composer.gotoScene(“scenes.lobby”)

end

scene:addEventListener(“create”, scene);

scene:addEventListener(“destroy”, scene)

return scene;

[/lua]

Your zombie is set to react to ANY collision by subtracting hit points from the hero.  You need to use some logic to filter out the objects that you don’t want to collide with the zombie and trigger the loss of hero hp.

[lua]

if event.other == hero then

     – hero damage routine

end

[/lua]

This might also be a good time to play around with collision filters

Thanks!

Your zombie is set to react to ANY collision by subtracting hit points from the hero.  You need to use some logic to filter out the objects that you don’t want to collide with the zombie and trigger the loss of hero hp.

[lua]

if event.other == hero then

     – hero damage routine

end

[/lua]

This might also be a good time to play around with collision filters

Thanks!