Hello Wonderfl

by chimad
はじめました。よろしくお願いします。
♥0 | Line 115 | Modified 2014-08-17 17:18:23 | MIT License
play

ActionScript3 source code

/**
 * Copyright chimad ( http://wonderfl.net/user/chimad )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/xJan
 */

package {
    import flash.display.Sprite;
    import flash.text.TextFormat;
    
    public class Main extends Sprite {
        public function Main() {
            var format:TextFormat = new TextFormat("_typeWriter", 36, 0x0, true);
            var animatedText:AnimatedText = new AnimatedText("Hello Wonderfl", format);
            addChild(animatedText);
            animatedText.x = (stage.stageWidth - animatedText.width) / 2;
            animatedText.y = (stage.stageHeight - animatedText.height) / 2;
            animatedText.play();
        }
    }
}

import flash.display.GradientType;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.text.TextFormat;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.Back;
import org.libspark.betweenas3.tweens.ITween;

class AnimatedText extends Sprite {
    public var text:String;
    public var textFormat:TextFormat;
    private var board:Sprite;
    private var bg:Sprite;
    private var bg2:Shape;
    private var tween:ITween;
    private var chars:Array;
    
    public function AnimatedText(text:String, textFormat:TextFormat) {
        this.text = text;
        this.textFormat = textFormat;
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
    }
    
    private function addedToStage(e:Event):void {
        removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
        // stageを参照したいので、ADDED_TO_STAGEイベントハンドラで初期化処理を行う
        initChars();
        initGradiationBox();
        initTweens();
    }
    
    private function initChars():void {
        board = new Sprite();
        board.cacheAsBitmap = true;
        chars = getChars(text);
        for each (var char:* in chars) {
            board.addChild(char);
        }
        addChild(board);
    }
    
    private function initGradiationBox():void {
        var color:uint = uint(textFormat.color);
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(width, height, 10 * Math.PI / 180);
        
        bg = new Sprite();
        bg.graphics.beginGradientFill(GradientType.LINEAR, [color, 0xFFFFFF, color], [1.0, 1.0, 1.0], [0, 127, 255], matrix);
        bg.graphics.drawRect(0, 0, width, height);
        bg.graphics.endFill();
        bg.cacheAsBitmap = true;
        bg.visible = false;
        
        var bg1:Shape = new Shape();
        bg1.graphics.beginFill(color);
        bg1.graphics.drawRect(0, 0, width, height);
        bg1.graphics.endFill();
        
        bg2 = new Shape();
        bg2.graphics.beginGradientFill(GradientType.LINEAR, [color, 0xFFFFFF, color], [1.0, 1.0, 1.0], [0, 127, 255], matrix);
        bg2.graphics.drawRect(0, 0, width, height);
        bg2.graphics.endFill();
        
        bg.addChild(bg1);
        bg.addChild(bg2);
        addChild(bg);
    }
    
    private function initTweens():void {
        var delay:Number = 0;
        var tweens:Array = [];
        for each (var char:* in chars) {
            tween = BetweenAS3.delay(BetweenAS3.tween(char, null, { y: -(stage.stageHeight / 2 + char.height) }, 1, Back.easeOut), delay);
            tweens.push(tween);
            delay += 0.2;
        }
        tween = BetweenAS3.parallelTweens(tweens);
        var applyMaskTween:ITween = BetweenAS3.func(function():void {
                bg.mask = board;
                bg.visible = true;
            } );
        var detachMaskTween:ITween = BetweenAS3.func(function():void {
                bg.mask = null;
                bg.visible = false;
            } );
        var scrollTween:ITween = BetweenAS3.tween(bg2, { $x:bg2.width }, { $x: -bg2.width }, 2);
        tween = BetweenAS3.delay(BetweenAS3.serial(tween, applyMaskTween, scrollTween, detachMaskTween), 0, 1);
        tween.stopOnComplete = false;
    }
    
    public function play():void {
        if (tween != null && !tween.isPlaying)
            tween.play();
    }
    
    private function getChars(str:String):Array {
        var array:Array = [];
        var chars:Array = str.split("");
        var width:Number = 0;
        for (var i:int = 0; i < chars.length; i++) {
            var tf:TextField = new TextField();
            tf.defaultTextFormat = textFormat;
            tf.text = chars[i];
            tf.autoSize = "left";
            tf.x = width;
            array.push(tf);
            width += tf.width;
        }
        return array;
    }
}