2014-03-19 59 views
1

這段代碼創建了一個大炮和3個氣球,大炮應該發射一顆子彈來破壞氣球,還有這些詞語。杜林大炮應該旋轉的過程中,當我從屏幕上釋放我的手指射擊。出於某種原因,它不響應,大炮不旋轉,也沒有射擊任何子彈。物理學在lua中不起作用

local score = 0 
local scoreText 
local scoreForLevelComplete 
local background 
local infoBar 
local restartBtn 
local cannon 
local levelNum 
local cannonCharge = {} 
local shot = {} 
local cannonBall 
local impulse = 0 
local balloons = {} 
local cannonCharge = {} 
local shot = {} 


function scene:createScene(event) 
    local group = self.view 

    background = display.newImage("bkg_clouds.png") 
    group:insert(background) 
    background.x = 230 
    background.y = 195 

    scoreText = display.newText("0", 0, 0, native.systemFont, 32) 
    scoreText:setFillColor(0,0, 0) 
    scoreText.x = 87 
    scoreText.y = 28 
    group:insert(scoreText) 

    questionText = display.newText('a', display.contentCenterX, display.contentWidth/4, native.systemFont, 40) 
    group:insert(questionText) 

    infoBar = display.newImage ("infoBar.png") 
    group:insert(infoBar) 
    infoBar.x = 10 
    infoBar.y = 25 

    restartBtn = display.newImage ("restartBtn.png") 
    group:insert(restartBtn) 
    restartBtn.x = 470 
    restartBtn.y = 300 

    cannon = display.newImage ("cannon.png") 
    group:insert(cannon) 
    cannon.x = 10 
    cannon.y = 270 

    cannon.anchorX = 0.5 
    cannon.anchorY = 0.5 
    restartBtn.isVisible = true 

    local balloon = display.newImage ('balloon_fat_red.png', 495, 125) 
    group:insert(balloon) 
    balloon = display.newImage ('balloon_fat_red.png', 495, 175) 
    group:insert(balloon) 
    balloon = display.newImage ('balloon_fat_red.png', 495, 225) 
    group:insert(balloon) 

    local balloonText1 = display.newText('\227\129\130', 495, 125) 
    balloonText1:setFillColor(1,1, 0) 
    local balloonText2 = display.newText('\227\129\132', 495, 170) 
    balloonText2:setFillColor(1,1, 0) 
    local balloonText3 = display.newText('\227\129\134', 495, 225) 
    balloonText3:setFillColor(1,1, 0) 

    balloon.name = 'balloon' 
    physics.addBody(balloon) 
    balloon.bodyType = 'static' 
    table.insert(balloons, balloon)  

    group:insert(balloonText1) 
    group:insert(balloonText2) 
    group:insert(balloonText3) 


    function ballCollision(e) 
     if (e.other.name == 'balloon') then 
      scene.updateScore() 
      e.target:removeSelf() 
      print ('remove balloon text') 
      e.other:removeSelf() 
      audio.play(pop) 
     end 
    end 

    function cannonCharge:touch(e) 
     if(e.phase == 'began') then 
      impulse = 0 
      cannon.isVisible = true 
      Runtime:addEventListener('enterFrame', charge) 
     end 
    end 

    function charge() 
     local degreesPerFrame = 0.5 
     cannon.rotation = cannon.rotation - degreesPerFrame 
     impulse=impulse-0.2 

     if(cannon.rotation < -46) then 
      cannon.rotation = -46 
      impulse = -3.2 
     end 
    end 

    function shot:touch(e) 
     if(e.phase == 'ended') then 
      Runtime:removeEventListener('enterFrame', charge) 
      cannon.isVisible = true 
      cannon.rotation = 0 

      cannonBall = display.newImage('cannon ball.png', 84, 220) 
      physics.addBody(cannonBall, {density = 1, friction = 0, bounce = 0}) 
      group:insert(cannonBall) 

      -- Shoot cannon ball 
      cannonBall:applyLinearImpulse(3, impulse, cannonBall.x, cannonBall.y) 

      --Collision listener 
      cannonBall:addEventListener ('collision', ballCollision) 
     end 
    end 
end 

這是我enterscene功能

function scene:enterScene(event) 
    local group = self.view 
    background:addEventListener('touch', cannonCharge) 
    background:addEventListener('touch', shot) 
end 
+0

對不起,格式,我編輯它,還添加了一些事件監聽器,但氣球仍然不會消失後,球擊中他們。 – user3305142

+0

函數cannonCharge:touch(e)和function shot:touch(e)持有對象,如果這就是你的意思。此外,只有第三個氣球消失,前兩個不會。 – user3305142

回答

1

我知道電暈文檔說聽衆可以是一個表對象時調用addEventListener('event', listener)但我從來沒有見過或使用的。在發佈的代碼中,沒有優勢在createScene中定義函數,因爲它們是全局的,並且您已經有一堆或模塊局部變量。嘗試拉動聽衆,使他們常規功能:

local canon 
... 
local cannonCharge = function(event) 
    if event.phase == 'began' then 
     impulse = 0 
     cannon.isVisible = true 
     Runtime:addEventListener('enterFrame', charge) 
    end 
end 

local shot = function(event) 
    ... 
end 

local function charge() 
    ... 
end 

... other local functions ... 

function scene:createScene(event) 
    ... 
end 

同時,確認你的觸摸聽衆正在打印每一個裏面的東西叫。

最後,也是最重要的一點,你只添加了最後一個氣球到物理中,所以子彈只能碰撞那個氣球。與創建每個氣球后必須添加group:insert(balloon)的方式相同,在每個組插入後應該有physics.addBody(balloon, ...)。所以這樣做:

local balloon1 = display.newImage ('balloon_fat_red.png', 495, 125) 
local balloon2 = display.newImage ('balloon_fat_red.png', 495, 175) 
local balloon3 = display.newImage ('balloon_fat_red.png', 495, 225) 

group:insert(balloon1) 
group:insert(balloon2) 
group:insert(balloon3) 

physics.addBody(balloon1) 
physics.addBody(balloon2) 
physics.addBody(balloon3) 

balloon1.bodyType = 'static' 
balloon2.bodyType = 'static' 
balloon3.bodyType = 'static' 

table.insert(balloons, balloon1)  
table.insert(balloons, balloon2)  
table.insert(balloons, balloon3)  

有很多的代碼重複出現,並增加更多的氣球,需要多條線路改變,所以你還不如分解出重複的代碼放到一個函數:

local function createBalloon(x, y) 
    local balloon = display.newImage ('balloon_fat_red.png', x, y) 
    group:insert(balloon) 
    physics.addBody(balloon) 
    balloon.bodyType = 'static' 
    table.insert(balloons, balloon)  
end 

createBalloon(495, 125) 
createBalloon(495, 175) 
createBalloon(495, 225) 

其優點是如果你需要更多的氣球,你不會忘記任何設置,並且任何新的設置放在createBallon中,因此所有氣球都具有相同的配置(除了函數參數,如x,y等)。

更新:確定

取決於該氣球在衝突處理,爲什麼你需要知道哪個氣球。例如,如果是因爲氣球1給出了10點,而3給出了30點,那麼有更好的方法:你可以添加你的領域的對象,就像你可以有balloon1.points = 10,balloon2.points = 30等(你會使一個函數參數爲createBalloon),並在碰撞處理程序中使用score = score + e.other.points。您只需要使用Local Collision Handling,因爲只需要知道大炮球何時與氣球碰撞。爲了弄清楚,如果是E.其它氣球,最簡單的是,當你創建氣球添加屬性:上述

local function createBalloon(x, y, balloonText) 
    local balloon = ... 
    ... 
    balloon.isBalloon = true -- only balloon objects will have this 
    balloon.label = balloonText 
end 

夫婦筆記:另一個自定義屬性爲label,因爲要刪除的氣球文本碰撞處理程序,最簡單的就是擁有一個屬性。但不要移除碰撞處理程序中碰撞涉及的物體,如that document中所述,請使用延遲移除。所以,你的處理變得

function ballCollision(e) 
    if e.other.isBalloon then 
     scene.updateScore(e.other.points) 

     timer.performWithDelay(1, e.target.removeSelf, e.target) 
     timer.performWithDelay(1, e.other.removeSelf, e.target) 

     e.other.label:removeSelf() -- this is ok: not involved in collision 
     audio.play(pop) 
    end 
end 
+0

如果我使用添加本地在finction charge()它給了我一個錯誤,「斷言錯誤」,但如果我不使用本地,球只會使第三個氣球消失,而不是第一個或第二個。 – user3305142

+0

@ user3305142已更新。 – Schollii

+0

如果我想比較我的子彈擊中哪個氣球,那麼我會用氣球1,2,3來更好嗎?例如,在ballCollision(e)中,我將測量球是否碰到第二個氣球,如果(event.object1.name =='balloon1')then ... else if(event.object2.name =='氣球2')然後... – user3305142

0

您已經聲明氣球作爲一個陣列,通過氣球 作爲一個變量,同時指定圖像給他們。所以你需要聲明3個單獨的氣球對象像氣球文本或者如果你正在使用數組,那麼你需要像這樣聲明。

for i=1,3 do 
    balloon[i] = display.newImage ('balloon_fat_red.png', 495, 225) 
    group:insert(balloon[i]) 
end 

所以它會識別你想拍攝哪個氣球。

+0

如果是這種情況,我如何將所有3個氣球插入氣球表中,因爲它們都有不同的對象名稱? – user3305142

+0

而且代碼也意味着3個氣球將在同一地點產卵3次。 – user3305142

+0

不需要將氣球插入氣球表中,因爲它已經是表。您可以根據自己的選擇更改氣球位置。即使用陣列來定位或做數學計算。 – Chomu