2014-10-19 58 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