2013-05-09 79 views
0

我正在尝试创建一个包含可在消失前被击中两次的边缘破坏游戏。Lua创建多个冲突

我曾尝试:

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

水平是填充有0和2。2是其中的后卫的图像将是在游戏中的表。

我的碰撞事件是像这样:

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 

当球与元素碰撞,他们都消失了。我怎样才能让一个人消失?

回答

1

我建议你只需在屏幕上放置强壮的物体,并向它们添加一个事件监听器,当较强的砖块发生碰撞时会创建较弱的砖块。这个想法是在发生碰撞时移除该对象并添加一个新对象。
首先,您将显示强壮的物体并将其添加到物理中。您也将增加当地的碰撞事件侦听器对象

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 

事件监听器会像

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 

希望的代码是自我解释:)
随意问我,如果您有任何进一步的问题。