Пример #1
0
        /// <summary>
        /// Since layer (and scene) opacity is broken this implements a workaround for a creating a fading transition.
        /// </summary>
        /// <param name="guiLayer1"></param>
        /// <param name="guiLayer2"></param>
        public static void TransitionFadingFromTo(MyLayer guiLayer1, MyLayer guiLayer2, MyLayer layer1, MyLayer layer2, float duration)
        {
            var fadeNode = new CCDrawNode();
            var bigRect  = new CCRect(-100000000, -100000000, 1000000000, 1000000000);

            fadeNode.BlendFunc = CCBlendFunc.NonPremultiplied;
            fadeNode.DrawRect(bigRect, CCColor4B.Transparent);
            guiLayer1.AddChild(fadeNode, int.MaxValue);
            void FadeIn(float prog, float du)
            {
                fadeNode.Clear(); fadeNode.DrawRect(bigRect, new CCColor4B(0f, 0f, 0f, prog));
            }

            void FadeOut(float prog, float du)
            {
                fadeNode.Clear(); fadeNode.DrawRect(bigRect, new CCColor4B(0f, 0f, 0f, 1 - prog));
            }

            fadeNode.AddAction(new CCSequence(new CCCallFiniteTimeFunc(duration / 2, FadeIn),
                                              Constants.oS != Constants.OS.WINDOWS ?
                                              new CCCallFunc(() =>
            {
                var director = layer1.Director;
                var scene    = director.RunningScene;
                var gv       = scene.GameView;

                fadeNode.RemoveFromParent();
                // the following are attempts at fixing the memory leak (which all mostly failed)
                // created by the fact that layers are not released for some reason
                layer1.RemoveAllListeners();
                guiLayer1.RemoveAllListeners();
                layer1.RemoveEventListeners();
                guiLayer1.RemoveEventListeners();
                layer1.RemoveFromParent();
                guiLayer1.RemoveFromParent();
                layer1.Clear();
                guiLayer1.Clear();
                layer1.Cleanup();
                guiLayer1.Cleanup();
                layer1.Dispose();
                guiLayer1.Dispose();
                scene.RemoveAllListeners();
                scene.RemoveAllChildren();
                scene.StopAllActions();
                scene.UnscheduleAll();
                scene.RemoveFromParent();
                scene.Cleanup();
                scene.Dispose();

                var scene2 = new CCScene(gv);
                scene2.AddLayer(guiLayer2);
                scene2.AddLayer(layer2, int.MinValue);
                guiLayer2.AddChild(fadeNode, int.MaxValue);
                director.ResetSceneStack();
                director.ReplaceScene(scene2);
                fadeNode.AddAction(new CCSequence(new CCCallFiniteTimeFunc(duration / 2, FadeOut),
                                                  new CCRemoveSelf()));
            })
                                              :
                                              new CCCallFunc(() =>
            {
                // this part is how it needs to be done in order to work on the old CocosSharp version
                //where GameView.Get fails (i.e. the DX-version)
                layer1.RemoveAllListeners();
                guiLayer1.RemoveAllListeners();
                var parent = layer1.Parent;
                layer1.RemoveFromParent();
                guiLayer1.RemoveFromParent();
                parent.AddChild(guiLayer2);
                parent.AddChild(layer2, int.MinValue);
                fadeNode.RemoveFromParent();
                guiLayer2.AddChild(fadeNode, int.MaxValue);
                fadeNode.AddAction(new CCSequence(new CCCallFiniteTimeFunc(duration / 2, FadeOut),
                                                  new CCRemoveSelf()));
            })
                                              ));
        }