Skip to content

Commit 6eaf855

Browse files
Changes to FlxTransition
1 parent d7f18b7 commit 6eaf855

File tree

4 files changed

+238
-36
lines changed

4 files changed

+238
-36
lines changed

flixel/addons/transition/FlxTransitionableState.hx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class FlxTransitionableState extends FlxState
9393
// play the exit transition, and when it's done call FlxG.switchState
9494
_exiting = true;
9595
transitionOut(onOutroComplete);
96-
96+
9797
if (skipNextTransOut)
9898
{
9999
skipNextTransOut = false;
@@ -170,6 +170,7 @@ class FlxTransitionableState extends FlxState
170170
{
171171
return switch (data.type)
172172
{
173+
case CUSTOM: data.transitionState;
173174
case TILES: new Transition(data);
174175
case FADE: new Transition(data);
175176
default: null;
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
package flixel.addons.transition;
2+
3+
// TODO: remove this check when min flixel version is 5.6.0,
4+
// So that FlxAddonDefines will handle this
5+
#if (flixel < "5.3.0")
6+
#error "Flixel-Addons is not compatible with flixel versions older than 5.3.0";
7+
#end
8+
9+
import flixel.FlxState;
10+
11+
/**
12+
* A `FlxState` which can perform visual transitions
13+
*
14+
* Usage:
15+
*
16+
* First, extend `FlxTransitionableState` as ie, `FooState`.
17+
*
18+
* Method 1:
19+
*
20+
* ```haxe
21+
* var in:TransitionData = new TransitionData(...); // add your data where "..." is
22+
* var out:TransitionData = new TransitionData(...);
23+
*
24+
* FlxG.switchState(new FooState(in,out));
25+
* ```
26+
*
27+
* Method 2:
28+
*
29+
* ```haxe
30+
* FlxTransitionableState.defaultTransIn = new TransitionData(...);
31+
* FlxTransitionableState.defaultTransOut = new TransitionData(...);
32+
*
33+
* FlxG.switchState(new FooState());
34+
* ```
35+
*/
36+
class FlxTransitionableSubState extends FlxSubState
37+
{
38+
// beginning & ending transitions for THIS state:
39+
public var transIn:TransitionData;
40+
public var transOut:TransitionData;
41+
42+
public var hasTransIn(get, never):Bool;
43+
public var hasTransOut(get, never):Bool;
44+
45+
/**
46+
* Create a state with the ability to do visual transitions
47+
* @param TransIn Plays when the state begins
48+
* @param TransOut Plays when the state ends
49+
*/
50+
public function new(?TransIn:TransitionData, ?TransOut:TransitionData)
51+
{
52+
transIn = TransIn;
53+
transOut = TransOut;
54+
55+
if (transIn == null && FlxTransitionableState.defaultTransIn != null)
56+
{
57+
transIn = FlxTransitionableState.defaultTransIn;
58+
}
59+
if (transOut == null && FlxTransitionableState.defaultTransOut != null)
60+
{
61+
transOut = FlxTransitionableState.defaultTransOut;
62+
}
63+
super();
64+
}
65+
66+
override function destroy():Void
67+
{
68+
super.destroy();
69+
transIn = null;
70+
transOut = null;
71+
_onExit = null;
72+
}
73+
74+
override function create():Void
75+
{
76+
super.create();
77+
transitionIn();
78+
}
79+
80+
override function startOutro(onOutroComplete:() -> Void)
81+
{
82+
if (!hasTransOut)
83+
onOutroComplete();
84+
else if (!_exiting)
85+
{
86+
// play the exit transition, and when it's done call FlxG.switchState
87+
_exiting = true;
88+
transitionOut(onOutroComplete);
89+
90+
if (FlxTransitionableState.skipNextTransOut)
91+
{
92+
FlxTransitionableState.skipNextTransOut = false;
93+
finishTransOut();
94+
}
95+
}
96+
}
97+
98+
/**
99+
* Starts the in-transition. Can be called manually at any time.
100+
*/
101+
public function transitionIn():Void
102+
{
103+
if (transIn != null && transIn.type != NONE)
104+
{
105+
if (FlxTransitionableState.skipNextTransIn)
106+
{
107+
FlxTransitionableState.skipNextTransIn = false;
108+
if (finishTransIn != null)
109+
{
110+
finishTransIn();
111+
}
112+
return;
113+
}
114+
115+
var _trans = createTransition(transIn);
116+
117+
_trans.setStatus(FULL);
118+
openSubState(_trans);
119+
120+
_trans.finishCallback = finishTransIn;
121+
_trans.start(OUT);
122+
}
123+
}
124+
125+
/**
126+
* Starts the out-transition. Can be called manually at any time.
127+
*/
128+
public function transitionOut(?OnExit:Void->Void):Void
129+
{
130+
_onExit = OnExit;
131+
if (hasTransOut)
132+
{
133+
var _trans = createTransition(transOut);
134+
135+
_trans.setStatus(EMPTY);
136+
openSubState(_trans);
137+
138+
_trans.finishCallback = finishTransOut;
139+
_trans.start(IN);
140+
}
141+
else
142+
{
143+
_onExit();
144+
}
145+
}
146+
147+
var transOutFinished:Bool = false;
148+
149+
var _exiting:Bool = false;
150+
var _onExit:Void->Void;
151+
152+
function get_hasTransIn():Bool
153+
{
154+
return transIn != null && transIn.type != NONE;
155+
}
156+
157+
function get_hasTransOut():Bool
158+
{
159+
return transOut != null && transOut.type != NONE;
160+
}
161+
162+
function createTransition(data:TransitionData):Transition
163+
{
164+
return switch (data.type)
165+
{
166+
case CUSTOM: data.transitionState;
167+
case TILES: new Transition(data);
168+
case FADE: new Transition(data);
169+
default: null;
170+
}
171+
}
172+
173+
function finishTransIn()
174+
{
175+
closeSubState();
176+
}
177+
178+
function finishTransOut()
179+
{
180+
transOutFinished = true;
181+
182+
if (!_exiting)
183+
{
184+
closeSubState();
185+
}
186+
187+
if (_onExit != null)
188+
{
189+
_onExit();
190+
}
191+
}
192+
}

flixel/addons/transition/Transition.hx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,41 +25,43 @@ import flixel.util.FlxTimer;
2525
class Transition extends FlxSubState
2626
{
2727
public var finishCallback(get, set):Void->Void;
28-
28+
2929
var _effect:TransitionEffect;
30-
30+
3131
public function new(data:TransitionData)
3232
{
3333
super(FlxColor.TRANSPARENT);
34-
34+
3535
_effect = createEffect(data);
3636
_effect.scrollFactor.set(0, 0);
3737
add(_effect);
3838
}
39-
39+
4040
public override function destroy():Void
4141
{
4242
super.destroy();
43-
43+
4444
finishCallback = null;
45-
45+
4646
_effect = FlxDestroyUtil.destroy(_effect);
4747
}
48-
48+
4949
public function start(newStatus:TransitionStatus):Void
5050
{
5151
_effect.start(newStatus);
5252
}
53-
53+
5454
public function setStatus(newStatus:TransitionStatus):Void
5555
{
5656
_effect.setStatus(newStatus);
5757
}
58-
58+
5959
function createEffect(data:TransitionData):TransitionEffect
6060
{
6161
switch (data.type)
6262
{
63+
case TransitionType.CUSTOM:
64+
return new TransitionEffect(data);
6365
case TransitionType.TILES:
6466
return new TransitionTiles(data);
6567
case TransitionType.FADE:
@@ -68,26 +70,26 @@ class Transition extends FlxSubState
6870
throw "Unexpected TransitionType: NONE";
6971
}
7072
}
71-
73+
7274
function get_finishCallback():Void->Void
7375
{
7476
if (_effect != null)
7577
{
7678
return _effect.finishCallback;
7779
}
78-
80+
7981
return null;
8082
}
81-
83+
8284
function set_finishCallback(callback:Void->Void):Void->Void
8385
{
8486
if (_effect != null)
8587
{
8688
_effect.finishCallback = callback;
87-
89+
8890
return callback;
8991
}
90-
92+
9193
return null;
9294
}
9395
}

0 commit comments

Comments
 (0)