/// <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())); }) )); }