使用Corona SDK使用情节提要重新启动游戏,并出现奇怪错误

使用Corona SDK使用情节提要重新启动游戏,并出现奇怪错误,sdk,lua,coronasdk,uistoryboard,Sdk,Lua,Coronasdk,Uistoryboard,我目前正在制作一个在科罗纳的游戏,有三个不同的场景,一个菜单,一个游戏,和一个游戏结束场景。在游戏中,当你们触摸你们的精灵时,它会沿着屏幕上下移动,在第一次玩的时候,它会很好地工作。但是,当你撞到某个东西并转到重新启动屏幕时,它会再次加载游戏,当你触摸屏幕时,精灵几乎不会向上移动,如果你放开它,它会迅速下降到底部,你无法通过再次触摸屏幕将其推上。你知道为什么会出现这个问题吗 local storyboard = require( "storyboard" ) local scene = stor

我目前正在制作一个在科罗纳的游戏,有三个不同的场景,一个菜单,一个游戏,和一个游戏结束场景。在游戏中,当你们触摸你们的精灵时,它会沿着屏幕上下移动,在第一次玩的时候,它会很好地工作。但是,当你撞到某个东西并转到重新启动屏幕时,它会再次加载游戏,当你触摸屏幕时,精灵几乎不会向上移动,如果你放开它,它会迅速下降到底部,你无法通过再次触摸屏幕将其推上。你知道为什么会出现这个问题吗

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

-- ================================= --
-- required library files below here --
---------------------------------------
local physics = require("physics");
physics.start(false);
physics.setGravity( 0, 9.8 )

require("mobdebug").start();
---------------------------------------
-- required library files above here --
-- ================================= --


-- ================================ --
-- local vars/references below here --
--------------------------------------

local gameBg;
local cloud;
local cloud2;
local bird;
local crashedBird;
local topBar;
local bottomBar;
local topOfScreen;
local bottomOfScreen;
local group;
_W = display.viewableContentWidth
_H = display.viewableContentHeight


--------------------------------------
-- local vars/references above here --
-- ================================ --


-- =================================== --
-- functions for this scene below here
-----------------------------------------


-----------------------------------------
-- functions for this scene above here
-- =================================== --



------------------
--
--  birdReady
--
------------------
function birdReady()
    bird.bodyType = "dynamic";
end

------------------
--
--  end birdReady
--
------------------

------------------
--
--  activateBird
--
------------------
function activateBird(self,event)
    self:applyForce(0, -0.5, self.x, self.y);
end
------------------
--
--  End activateBird
--
------------------

------------------
--
--  Touch Screen Function
--
------------------
function touchScreen(event)
    if(event.phase == "began") then
        bird.enterFrame = activateBird;
        Runtime:addEventListener("enterFrame",bird);
    end

    if(event.phase == "ended") then
        Runtime:removeEventListener("enterFrame", bird);
    end
    return true;
end
-----------------
--
--  TouchScreen End
--
-----------------

-----------------
--
--  gameOver()
--
-----------------
function gameOver()

    bird.collided = false;
    storyboard.gotoScene("menu",  { effect = defaultTransition });
  --physics.setGravity( 0, 9.8 )

end
-----------------
--
--  end gameOver()
--
-----------------


-----------------
--
--  crashed()
--
-----------------
function crashed()
    crashedBird.x = bird.x;
    crashedBird.y = bird.y;
    crashedBird.isVisible = true;
    bird.bodyType = "static";
    bird.isVisible = false;
    gameOver();

end
-----------------
--
--  end crashed()
--
-----------------

-----------------
--
--  onCollision()
--
-----------------
function onCollision(event)
    if(event.phase == "began") then
        if(bird.collided == false) then
            bird.collided = true;
            crashed();
        end
    end
end
-----------------
--
--  end onCollision()
--
-----------------

-----------------
--
--Event Listener for touch
--
-----------------
Runtime:addEventListener("touch", touchScreen);

-----------------
--
--  End event Listener for touch
--
-----------------

-- Called when the scene's view does not exist:
function scene:createScene( event )
    group = self.view

    -- CREATE display objects and add them to 'group' here.




    -------------------
    --
    --  Bird
    --
    -------------------
    bird = display.newImage("images/bird.png");
    bird.x = (_W / 2) - 90;
    bird.y = _H / 2;
    bird.xScale = 0.7;
    bird.yScale = 0.8;
    bird.collided = false;


    physics.addBody(bird,"static", {density = 0.1, friction = 0.5, bounce = 0.1, radius = 12});

    group:insert(bird);

    birdIntro = transition.to(bird, {time = 2000, x = 100, onComplete = birdReady});
    --------------------
    --
    -- End Bird
    --
    --------------------

    --------------------
    --
    --  Crashed Bird
    --
    --------------------
    crashedBird = display.newImage("images/crashed.png");
    crashedBird.x = 100;
    crashedBird.y = 100;
    crashedBird.isVisible = false;
    group:insert(crashedBird);
    --------------------
    --
    --  End Crashed Bird
    --
    --------------------



end


-- Called immediately after scene has moved onscreen:
function scene:enterScene( event )
    local group = self.view

    globalGroup = display.newGroup();
    group:insert(globalGroup);


    -- INSERT code here (e.g. start timers, load audio, start listeners, etc.)

    --storyboard.purgeScene("menu");
    --Purge the end game file if added

    storyboard.loadScene("menu");

    --Runtime listener for the touch on the screen
    Runtime:addEventListener("touch", touchScreen);

    --Moves the cloud from right to left
    cloud.enterFrame = scrollCloud;
    Runtime:addEventListener("enterFrame", cloud);

    --Moves the cloud from right to left
    cloud2.enterFrame = scrollCloud;
    Runtime:addEventListener("enterFrame", cloud2);

    --Moves the top barricade from right to left
    topBar.enterFrame = scrollCloud;
    Runtime:addEventListener("enterFrame", topBar);

    --Moves the bottom barricade from right to left
    bottomBar.enterFrame = scrollCloud;
    Runtime:addEventListener("enterFrame", bottomBar);

    --Detects the collision
    Runtime:addEventListener("collision", onCollision);


end


-- Called when scene is about to move offscreen:
function scene:exitScene( event )
    local group = self.view



  bird:removeSelf();


 gameBg:removeSelf();
 cloud:removeSelf();
 cloud2:removeSelf();

 crashedBird:removeSelf();
 topBar:removeSelf();
 bottomBar:removeSelf();
 topOfScreen:removeSelf();
 bottomOfScreen:removeSelf();
 group:removeSelf();

    -- INSERT code here (e.g. stop timers, remove listeners, unload sounds, etc.)

    Runtime:removeEventListener("touch", touchScreen);

    Runtime:removeEventListener("enterFrame", bird);

    Runtime:removeEventListener("enterFrame", cloud);

    Runtime:removeEventListener("enterFrame", cloud2);

    Runtime:removeEventListener("enterFrame", topBar);

    Runtime:removeEventListener("enterFrame", bottomBar);

    Runtime:removeEventListener("collision", onCollision);
    --storyboard.removeAll ( )

end


-- Called prior to the removal of scene's "view" (display group)
function scene:destroyScene( event )
    local group = self.view
  --storyboard.removeAll();
    -- INSERT code here (e.g. remove listeners, widgets, save state, etc.)


  --bird:removeSelf();

    -- INSERT code here (e.g. stop timers, remove listeners, unload sounds, etc.)
    Runtime:removeEventListener("touch", touchScreen);

    Runtime:removeEventListener("enterFrame", bird);

    Runtime:removeEventListener("enterFrame", cloud);

    Runtime:removeEventListener("enterFrame", cloud2);

    Runtime:removeEventListener("enterFrame", topBar);

    Runtime:removeEventListener("enterFrame", bottomBar);

    Runtime:removeEventListener("collision", onCollision);
  group = nil;
end



---------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

-- "createScene" event is dispatched if scene's view does not exist
scene:addEventListener( "createScene", scene )

-- "enterScene" event is dispatched whenever scene transition has finished
scene:addEventListener( "enterScene", scene )

-- "exitScene" event is dispatched before next scene's transition begins
scene:addEventListener( "exitScene", scene )

-- "destroyScene" event is dispatched before view is unloaded, which can be
-- automatically unloaded in low memory situations, or explicitly via a call to
-- storyboard.purgeScene() or storyboard.removeScene().
scene:addEventListener( "destroyScene", scene )


---------------------------------------------------------------------------------

return scene

在我看来,问题在于您在退出到下一个场景之前没有删除所有侦听器。确保清除所有变量并正确结束所有事件侦听器。我个人对故事板不太熟悉。如果您不能让它工作,我建议您不要使用任何东西,只使用一个main.lua,只需要从main中调用其他lua文档的函数即可。您自己处理错误清理可能会容易得多。

有了这样的功能,您确实需要发布一些代码/示例。否则将很难帮助您。@MagicMan我刚刚添加了一些代码示例。谢谢你的帮助。