LUA/Corona sdk: storyboard.gotoScene() 不起作用。
2014-1-12 16:46:0
收藏:0
阅读:95
评论:2
我是 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;
解决了问题,不确定为什么。
点赞
用户869951
"enterFrame"事件在Runtime对象中的每一帧都会生成,约为30到60次/秒。因此如果可能,每一帧都会调用win()。由于win()会导致转换到一个新场景,如果storyboard.purgeOnSceneChange = false,那么对于每一个场景,都会调用enterFrame,导致win()的不断流和不断转换到相同的场景“MSCREEN.mscreen”(这不是好的情况)。另一方面,如果你将storyboard.purgeOnSceneChange = true,则之前的场景,在这里调用enterFrame调用win(),被清除,所以win()只会被调用一次。
总之,设置storyboard.purgeOnSceneChange = true可能会有用,但我觉得你的逻辑存在问题:场景转换不应该在每一帧被调用!如果你正在监视某个条件来宣布胜利,你应该在win()中删除enterFrame回调或确保win()被调用一次后条件为假:
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
2014-01-13 04:30:22
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
注意
win()函数,它似乎被调用了很多次。设置另一个变量并在方法中进行更改。function win() isNotWin = false -- 这样这个方法就不会被频繁调用。 print("win!") storyboard.gotoScene( "MSCREEN.mscreen" ) end function scene:enterFrame(inEvent) --一些其他的操作 if (ball.x>display.contentWidth and failFlag==false and isNotWin == true) then win(); end end