2015-09-14 2 views
0

Этот код предназначен для обмена с сцены на сцену на таймер между сценами1 и сценой2. Когда счетчик переменной currentBar достигает 4, он должен перейти к сцене3, но этого не делать. Этот пример начинается с scene2.Lua if/elseif, ведущий к разным сценам, не работает

local composer = require ("composer") 
local scene = composer.newScene() 

    local function showScene2() 
     local options = { 
      effect = "slideLeft", 
      time = 30, 
     } 
    composer.gotoScene("scene2", options) 

    end 

-- create scene 

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

end 

function scene:show(event) 
local sceneGroup = self.view 
local phase = event.phase 
    if (phase == "will") then 
     local background = display.newImage("images/staveBlankgrey2.png", 240, 160) 
     note1 = display.newImage("images/crDown.png", 130, 171) 
     note2 = display.newImage("images/crUp.png", 320, 144) 

     sceneGroup:insert(background) 
     sceneGroup:insert(note1) 
     sceneGroup:insert(note2) 

    elseif (phase == "did") then 
     currentBar = currentBar + 1 

Этот раздел работает отлично:

  if currentBar < 4 then 
       local function showScene2() 
        local options = { 
         effect = "slideLeft", 
         time = 30, 
        } 
       composer.gotoScene("evenBars", options) 
      end 
       timer.performWithDelay(tempo, showEvenBars) 

Этот раздел не работает:

  elseif currentBar == 4 then  
       local function showEndBar() 
        local options = { 
         effect = "slideLeft", 
         time = 30, 
        } 
       composer.gotoScene("endBar", options) 
      end 
       timer.performWithDelay(tempo, showEndBar) 

      end 
    end 
end 

function scene:hide(event) 
    local sceneGroup = self.view 
    local phase = event.phase 
end 

function scene:destroy(event) 
    local sceneGroup = self.view 
end 

scene:addEventListener("create", scene) 
scene:addEventListener("show", scene) 
scene:addEventListener("hide", scene) 
scene:addEventListener("destroy", scene) 

return scene 

Что мне не хватает? Благодарю.

ответ

0

Я не вижу, где tempo или currentBar создано, поэтому я буду считать, что они являются глобальными переменными.

Что касается вашей проблемы, я бы, вероятно, немного переписал ее и создаю новый файл (потому что и сценарий1, и сцена2 будут вызывать эту функцию и, возможно, больше сцен в будущем, поэтому лучше иметь ее в отдельном файле).

И затем в сцене я бы добавил слушателя событий enterFrame.

Некоторые код:

scene_swapper.lua слушатель

local M = {} 

function M.returnSceneName(val) 
    if val == nil then return nil 
    elseif val == 4 then return "scene1" 
    elseif val < 4 then return "scene2" 
    end 
end 

return M 

событий в моих сценах:

local sw = require("scene_swapper") 
Runtime:addEventListener("enterFrame", 
    function() 
     local swap_to_scene = sw.returnSceneName(currentBar) 
     if swap_to_scene ~= nil and swap_to_scene ~= composer.getSceneName("current") then 
      composer.gotoScene(swap_to_scene) 
     end 
    end 
) 

enterFrame слушатель будет проверяться один раз каждый кадр (30 или 60 раз в секунду), поэтому, когда вы обновляете значение currentBar, оно действительно примет соответствующие меры.

Также не забудьте удалить прослушиватель enterFrame, если вы смените сцену.

Смежные вопросы