HaxePunk/HaxePunk

View on GitHub
haxepunk/tweens/misc/ColorTween.hx

Summary

Maintainability
Test Coverage
package haxepunk.tweens.misc;

import haxepunk.Tween;
import haxepunk.utils.Color;
import haxepunk.utils.Ease.EaseFunction;

/**
 * Tweens a color's red, green, and blue properties
 * independently. Can also tween an alpha value.
 */
class ColorTween extends Tween
{
    /**
     * The current color.
     */
    public var color:Color;

    /**
     * The current alpha.
     */
    public var alpha:Float = 1;

    /**
     * Red value of the current color, from 0 to 255.
     */
    public var red(default, null):Int;

    /**
     * Green value of the current color, from 0 to 255.
     */
    public var green(default, null):Int;

    /**
     * Blue value of the current color, from 0 to 255.
     */
    public var blue(default, null):Int;

    /**
     * Constructor.
     * @param    complete    Optional completion callback.
     * @param    type        Tween type.
     */
    public function new(?type:TweenType)
    {
        super(0, type);
    }

    /**
     * Tweens the color to a new color and an alpha to a new alpha.
     * @param    duration        Duration of the tween.
     * @param    fromColor        Start color.
     * @param    toColor            End color.
     * @param    fromAlpha        Start alpha
     * @param    toAlpha            End alpha.
     * @param    ease            Optional easer function.
     */
    public function tween(duration:Float, fromColor:Color, toColor:Color, fromAlpha:Float = 1, toAlpha:Float = 1, ?ease:EaseFunction)
    {
        fromColor &= 0xFFFFFF;
        toColor &= 0xFFFFFF;
        color = fromColor;
        red = fromColor >> 16 & 0xFF;
        green = fromColor >> 8 & 0xFF;
        blue = fromColor & 0xFF;
        _startR = red / 255;
        _startG = green / 255;
        _startB = blue / 255;
        _rangeR = ((toColor >> 16 & 0xFF) / 255) - _startR;
        _rangeG = ((toColor >> 8 & 0xFF) / 255) - _startG;
        _rangeB = ((toColor & 0xFF) / 255) - _startB;
        _startA = alpha = fromAlpha;
        _rangeA = toAlpha - alpha;
        _target = duration;
        _ease = ease;
        start();
    }

    /** @private Updates the Tween. */
    @:dox(hide)
    override function updateInternal()
    {
        alpha = _startA + _rangeA * _t;
        red = Std.int((_startR + _rangeR * _t) * 255);
        green = Std.int((_startG + _rangeG * _t) * 255);
        blue = Std.int((_startB + _rangeB * _t) * 255);
        color = red << 16 | green << 8 | blue;
    }

    // Color information.
    var _startA:Float;
    var _startR:Float;
    var _startG:Float;
    var _startB:Float;
    var _rangeA:Float;
    var _rangeR:Float;
    var _rangeG:Float;
    var _rangeB:Float;
}