2014-10-19 32 views
0

我目前正在设法解决如何使用Corona SDK射击弹丸。但是,我不知道这样做的最佳方式。我猜你必须产生同一个对象的实例并对它们施加强制,但我不知道最好的方法来实现它,或者我应该如何处理每个实例。我仍然在学习Lua,只需要一些指导如何去做,任何帮助将不胜感激。Corona SDK - 射击弹丸(处理每个实例)

我想能够检查是否有任何子弹击中传感器对象(我没有实现这一点,但我知道如何)在屏幕的顶部,然后销毁击中传感器的子弹,但如何我是否检查每个实例并单独销毁它们?

这是我迄今为止的基本结构。

display.setStatusBar(display.HiddenStatusBar) 
local physics = require('physics') 
physics.start() 


local speed = -500 
local contentW, contentH = display.contentWidth, display.contentHeight 


-- Background 
local bg = display.newRect(0, 0, contentW, contentH) 
bg.anchorX = 0 
bg.anchorY = 0 
bg:setFillColor(0, 1, 1) 


-- Ground 
local ground = display.newRect(0, contentH - 50, contentW, 50) 
ground.anchorX = 0 
ground.anchorY = 0 
ground:setFillColor(0, 0.8, 0) 


-- Hero 
local hero = display.newRect(contentW/2, contentH/2, 40, 40) 
hero:setFillColor(1, 0, 0) 


function shoot(event) 
    if (event.phase == 'began') then 
     local projectile = display.newRect(hero.x, hero.y, 10, 30) 
     physics.addBody(projectile, 'dynamic') 
     projectile.gravityScale = 0 
     projectile.isBullet = true 
     projectile:setLinearVelocity(0, -600) 
    end 
end 

Runtime:addEventListener('touch', shoot) 

回答

0

这是在电晕论坛建议由Corona工作人员。

要移除撞击传感器的每颗子弹,您需要为子弹沿着这些线条赋予“类型”。请注意,您可以使用任何单词而不是'type',但这是我首选的方式。

projectile.type = 'bullet' 

然后,你需要一个事件侦听器添加到传感器对象检测碰撞,在这种情况下,所谓的“墙”的对象。碰撞时,您想要移除碰撞中的其他物体(项目符号)。你可以这样做。

local function wallCollision(event) 
    if event.phase == 'began' then 
     if event.other.type == 'bullet' then 
      display.remove(event.other) 
      event.other = nil 
     end 
    end 
end 

wall:addEventListener('collision', wallCollision) 

'event.other'将碰撞事件中涉及的其他对象(本例中为'bullet')作为目标。

+0

这是在电晕论坛上向我解释的方法,这是由Corona工作人员之一回答的。他还检查了我的代码,但没有对此作出评论,因此我认为这是正确的解决方案。我已经更新了我的解决方案,指出它是一种替代方法,并且您的解决方案也可以工作。如果调用一个将'other'对象作为参数并在该函数中删除它的函数也是一种可行的方法,而不是使用计时器? – guitarmatt99 2014-10-25 21:16:26

+0

如果别人在另一个论坛上提供了答案,那么在SO中做的正确的事情就是在该论坛中引用该帖子(当然,它有一个URL)。也就是说,现在我的脸上有鸡蛋,因为我刚刚查看了说这是改变的文档/创建了不需要基本移除的文档(请参阅下一条评论)。 – Schollii 2014-10-25 21:43:11

+0

来自Corona文档:“如果您需要修改/创建一个碰撞结果的对象,碰撞处理程序应该设置一个标志或添加时间延迟,以便在下一个应用程序循环或更高版本中进行更改,例如通过timer.performWithDelay()。在碰撞期间,一个或两个对象的基本移除(display.remove()或object:removeSelf())不受此规则的约束。 – Schollii 2014-10-25 21:43:38

0

不知道这是你所追求的,但处理不断变化的,可后来因为碰撞的结果中删除多个对象的策略是:

  1. 创建子弹显示对象,具有碰撞处理程序
  2. 在碰撞处理程序中,如果需要删除对象,则使用removeSelf;其他更改可能需要延迟更改,如Modifying Objects中所述。

因此,在您shoot功能将添加,projectile:setLinearVelocity后:

projectile.collision = function (event) 
     ... 
     if remove then 
      self:removeSelf() 
     end 
     ... 
    end 
projectile:addEventListener("collision", projectile) 

这增加了处理程序,以每发子弹。您可以改为只添加一个处理程序传感器,这将是类似的代码,你将创建传感器后摆正,除非你删除的selfevent.other代替:

sensor.collision = function (event) 
     ... 
     if remove then 
      event.other:removeSelf() 
     end 
     ... 
    end 
sensor:addEventListener("collision", sensor) 
+0

感谢您的回复,但我已经解决了这个问题!无论如何,我会发布一个答案以及如何去做。 – guitarmatt99 2014-10-21 15:17:15