Skip to content

Commit 4e57ec4

Browse files
committed
tween framerate
1 parent 6a2d6ef commit 4e57ec4

File tree

3 files changed

+47
-3
lines changed

3 files changed

+47
-3
lines changed

flixel/tweens/FlxTween.hx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ class FlxTween implements IFlxDestroyable
505505
public var active(default, set):Bool = false;
506506
public var duration:Float = 0;
507507
public var ease:EaseFunction;
508+
public var framerate:Null<Float>;
508509
public var onStart:TweenCallback;
509510
public var onUpdate:TweenCallback;
510511
public var onComplete:TweenCallback;
@@ -562,6 +563,7 @@ class FlxTween implements IFlxDestroyable
562563
onUpdate = Options.onUpdate;
563564
onComplete = Options.onComplete;
564565
ease = Options.ease;
566+
framerate = Options.framerate;
565567
setDelays(Options.startDelay, Options.loopDelay);
566568
this.manager = manager != null ? manager : globalManager;
567569
}
@@ -619,13 +621,22 @@ class FlxTween implements IFlxDestroyable
619621

620622
function update(elapsed:Float):Void
621623
{
622-
_secondsSinceStart += elapsed;
624+
var preTick:Float = _secondsSinceStart;
625+
var postTick:Float = (_secondsSinceStart += elapsed);
626+
623627
var delay:Float = (executions > 0) ? loopDelay : startDelay;
624628
if (_secondsSinceStart < delay)
625629
{
626630
return;
627631
}
628-
scale = Math.max((_secondsSinceStart - delay), 0) / duration;
632+
633+
if (framerate != null && framerate > 0)
634+
{
635+
preTick = Math.fround(preTick * framerate) / framerate;
636+
postTick = Math.fround(postTick * framerate) / framerate;
637+
}
638+
639+
scale = Math.max((postTick - delay), 0) / duration;
629640
if (ease != null)
630641
{
631642
scale = ease(scale);
@@ -647,7 +658,7 @@ class FlxTween implements IFlxDestroyable
647658
}
648659
else
649660
{
650-
if (onUpdate != null)
661+
if (postTick > preTick && onUpdate != null)
651662
onUpdate(this);
652663
}
653664
}
@@ -919,6 +930,12 @@ typedef TweenOptions =
919930
*/
920931
@:optional var ease:EaseFunction;
921932

933+
/**
934+
* Optional set framerate for this tween to update at.
935+
* This also affects how often `onUpdate` is called.
936+
*/
937+
@:optional var framerate:Float;
938+
922939
/**
923940
* Optional start callback function.
924941
*/

flixel/tweens/misc/FlickerTween.hx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ typedef FlickerTweenOptions =
2323
*/
2424
@:optional var ease:EaseFunction;
2525

26+
/**
27+
* Optional set framerate for this tween to update at.
28+
* This also affects how often `onUpdate` is called.
29+
* Not to be confused with `period` for flickering.
30+
*/
31+
@:optional var framerate:Float;
32+
2633
/**
2734
* Optional start callback function.
2835
*/

tests/unit/src/flixel/tweens/FlxTweenTest.hx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,26 @@ class FlxTweenTest extends FlxTest
432432
Assert.isTrue(tween3Updated);
433433
}
434434

435+
@Test
436+
function testTweenFramerate()
437+
{
438+
// no given tween framerate
439+
var tweenUpdatesDefault:Int = 0;
440+
var tweenDefault:FlxTween = FlxTween.tween(this, {value: 1000}, 2, {startDelay: 0.54321, onUpdate: function(_) tweenUpdatesDefault++});
441+
step(FlxG.updateFramerate * 3); // 3 full seconds
442+
Assert.areEqual(FlxG.updateFramerate * 2, tweenUpdatesDefault);
443+
444+
// various tween framerate values
445+
var testFramerates:Array<Float> = [5, 10, 10.1, 24, 29.9, 30, 30.1, 31, 59.9, 60, 100];
446+
for (framerate in testFramerates)
447+
{
448+
var tweenUpdates:Int = 0;
449+
var tween:FlxTween = FlxTween.tween(this, {value: 1000}, 2, {startDelay: 0.54321, framerate: framerate, onUpdate: function(_) tweenUpdates++});
450+
step(FlxG.updateFramerate * 3); // 3 full seconds
451+
Assert.areEqual(Std.int(Math.ceil(Math.min(framerate, FlxG.updateFramerate) * 2)), tweenUpdates);
452+
}
453+
}
454+
435455
function makeTween(duration:Float, onComplete:TweenCallback, ?onUpdate:TweenCallback):FlxTween
436456
{
437457
var foo = {f: 0};

0 commit comments

Comments
 (0)