【问题标题】:LUA/Corona sdk: storyboard.gotoScene() not workingLUA/Corona sdk:storyboard.gotoScene() 不工作
【发布时间】:2014-01-31 07:29:50
【问题描述】:

我是 Corona 和 Lua 的新手,请耐心等待。 所以我有一个主屏幕,我从我的主文件转到它,它工作正常。然后我想从不同的场景回到那个场景,没有任何反应(但是“胜利”正在向我的控制台窗口发送垃圾邮件)。

win函数:

function win()  
    print("win!");
    storyboard.gotoScene( "MSCREEN.mscreen" );
end

我调用它的函数:

function scene:enterFrame(inEvent)
  --some other stuff
  if (ball.x>display.contentWidth and failFlag==false) then
    win();
  end

 end

和我的主要场景:

local scene = storyboard.newScene();
local bg;
local text;

function scene:createScene(inEvent)
    bg = display.newImage( "MSCREEN/bg.png");
    bg.x = display.contentWidth / 2;
    bg.y = display.contentHeight / 2;

    text=display.newText( "Touch!", 0,0, fontName, 70);
    text.x =display.contentWidth / 2 ;
    text.y =display.contentHeight / 2 +230;  

    self.view:insert(bg);
    self.view:insert(text);
end

function scene:enterFrame(inEvent)
 tekstBujany(text);
end

function scene:touch(inEvent)   
    if inEvent.phase == "ended" then  
        storyboard.gotoScene( "JUMP.GJump" );       
    end
end

function scene:destroyScene(inEvent)
bg:removeSelf();
bg=nil;

text:removeSelf();
text=nil;
end -- End destroyScene().

scene:addEventListener("createScene", scene);
scene:addEventListener("destroyScene", scene);
Runtime:addEventListener("enterFrame", scene);
Runtime:addEventListener("touch",scene);

return scene;

已解决 所以添加

storyboard.purgeOnSceneChange = true;

成功了,不知道为什么。

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    小心 win() 函数,它看起来被调用了很多次。设置另一个变量并在方法中更改它。

    function win()
        isNotWin = false -- so this method doesn't get called a lot of times.
        print("win!")
        storyboard.gotoScene( "MSCREEN.mscreen" )
    end
    
    function scene:enterFrame(inEvent)
        --some other stuff
        if (ball.x>display.contentWidth and failFlag==false and isNotWin == true) then
            win();
        end
    
    end
    

    【讨论】:

    • 谢谢,我正在慢慢掌握电晕。但慢慢来;]
    • @yeris 不确定您所说的“低代表”是什么意思;另外,我指的是 Fayer 的答案,而不是我的(尽管如果您发现我的答案也很有用,那么无论如何:)
    【解决方案2】:

    运行时对象的每一帧都会生成“enterFrame”事件,因此大约为 30 到 60 次/秒。因此,如果可能,将在每一帧调用 win()。由于 win() 会导致转换到新场景,如果 storyboard.purgeOnSceneChange = false 则为每个场景调用 enterFrame,从而导致 win() 调用的持续流和到同一场景“MSCREEN.mscreen”的持续转换流(这可不好)。 OTOH,如果您设置 storyboard.purgeOnSceneChange = true,那么前一个场景,这里是调用 win() 的带有 enterFrame 的场景,将被清除,因此 win() 只会被调用一次。

    总之,设置 storyboard.purgeOnSceneChange = true 可能有效,但我认为你的逻辑存在问题:不应该在每一帧都调用场景转换!如果您正在监视某个条件以声明获胜,您应该删除 win() 中的 enterFrame 回调,或者确保在 win() 调用一次后条件为 false:

    function scene:enterFrame(inEvent)
      if (ball.x > display.contentWidth and failFlag == false) then
        win();
        Runtime:removeEventListener("enterFrame", scene);
      end
    end
    

    使用保护变量,它看起来像这样:

    local winCalled = false
    
    function win()
        winCalled = true
        ...
    end
    
    function scene:enterFrame(inEvent)
      if (ball.x > display.contentWidth and failFlag == false) then
        win();
      end
    end
    

    【讨论】:

    • 谢谢,我确信在第一次调用 goToScene 之后,输入帧就停止了。而且我可以大声疾呼,我认为保持 storyboard.purgeOnSceneChange = true 是个好主意(我有很多场景)对吗?
    • @yeris 您的解决方案有效,但由于您使用的设置的幸运副作用,所以我只想为您提供另一种选择,以防您正在寻找更强大的解决方案。我希望您发现添加到您的技巧包中很有用。
    • 是的,我改变了它,我的意思是整个逻辑。我只想知道保持 storyboard.purgeOnSceneChange = true 是否是个好主意。
    • @yeris 如果您想在每次转换到另一个场景时释放当前场景使用的资源,无一例外。所以我想说它只应该在内存不足或存在其他性能问题的情况下使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多