Lua if/elseif导致不同场景不工作
Lua if/elseif leading to different scenes is not working
此代码旨在在场景 1 和场景 2 之间的计时器上从一个场景切换到另一个场景。当 currentBar 变量计数器达到 4 时,它应该转到 scene3 但没有。这个例子从 scene2 开始。
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
我错过了什么?谢谢。
我看不到 tempo
或 currentBar
的创建位置,因此我将 假设 它们是全局变量。
关于你的问题,我可能会稍微重写它并创建一个新文件(因为 scene1 和 scene2 都会调用这个函数,将来可能会有更多场景,所以最好将它放在一个单独的文件中) .
然后在场景中添加一个 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 侦听器。
此代码旨在在场景 1 和场景 2 之间的计时器上从一个场景切换到另一个场景。当 currentBar 变量计数器达到 4 时,它应该转到 scene3 但没有。这个例子从 scene2 开始。
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
我错过了什么?谢谢。
我看不到 tempo
或 currentBar
的创建位置,因此我将 假设 它们是全局变量。
关于你的问题,我可能会稍微重写它并创建一个新文件(因为 scene1 和 scene2 都会调用这个函数,将来可能会有更多场景,所以最好将它放在一个单独的文件中) .
然后在场景中添加一个 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 侦听器。