首页 文章

LUA / Corona sdk:storyboard.gotoScene()无效

提问于
浏览
0

我是Corona和Lua的新手,所以请耐心等待 . 所以我有一个主屏幕,我从我的主文件中去,它工作正常 . 然后我想从一个不同的场景回到那个场景,没有任何反应(但“胜利”是我的consol窗口) .

胜利功能:

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;

SOLVED 所以加入

storyboard.purgeOnSceneChange = true;

做了伎俩,不知道为什么 .

2 回答

  • 2

    “enterFrame”事件在Runtime对象的每一帧生成,因此大约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
    

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

    local winCalled = false
    
    function win()
        winCalled = true
        ...
    end
    
    function scene:enterFrame(inEvent)
      if (ball.x > display.contentWidth and failFlag == false) then
        win();
      end
    end
    
  • 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
    

相关问题