まずは連続でフェードアウトするスライドショー~TweenオブジェクトとTweenEvent

さて、XMLのデータが読み込めればスライドショーをさせる環境は揃ったも同然です。今回はいよいよスライドショーを作ります。
ということでSlideShowというクラスを作るのですが、何が必要かちょっと考えて見ます。

単純に考えます。

  • 基本的に画像しか出さない。
  • Tweenクラスを使ってフェードアウトするスライドショー。
  • 永遠にループする。
  • 画像は先にすべてFlash上に読み込む。

細かく考えます。

  1. スライドショー自体はムービークリップで作るので、MovieClipクラスを継承。
  2. コンストラクタでXMLからパースした配列を渡す。
  3. コンストラクタで配列のデータから画像の読み込みまで行ってしまう。
  4. 読み込んだ画像はインスタンス変数の配列に格納する。
  5. 4をスライドするけど順序管理のため、インスタンス変数pointerをつくり、現在のスライドを格納する。

ここまで考え終わったので、こんなクラスを作ってみました。

package com.tom_gs.www.slideshow {
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.utils.Timer;
    import fl.transitions.*;
    import fl.transitions.easing.*;

    /**
     * SlideShow.as
     * This class creates easy slide show
     */
   
    public class SlideShow extends MovieClip{

        /**
         * Current slide index
         */
        private var pointer:Number = 0;

        /**
         * Max value of slide pointer
         */
        private var pointerMax:Number = 0;

        /**
         * MovieClip instances of slide
         */
        private var slides:Array = new Array();

        /**
         * Is current slide the first one?
         */
        private var firstSlide:Boolean = true;

        /**
         * SlideShow constructor
         */
        public function SlideShow(data:Array) {
            this.pointerMax = this.pointer = data.length - 1;
            var num = 0;
            for (var i in data){
                var loader:Loader = new Loader();
                var url:String = data[i].image;
                var request:URLRequest = new URLRequest(url);
                loader.load(request);
                this.slides[i] = loader;
                this.addChild(slides[slides.length - 1]);
            }
        }

        /**
         * Get previous pointer
         */
        private function getPrevPointer():Number {
            var pointer:Number = this.pointer;
            pointer++;
            if (pointer > this.pointerMax){
                pointer = 0;
            }
            return pointer;
        }

        /**
         * Get next pointer
         */
        private function getNextPointer():Number {
            var pointer:Number = this.pointer;
            pointer--;
            if (pointer < 0){
                pointer = this.pointerMax;
            }
            return pointer;
        }

        /**
         * Set instance variable pointer to next one
         */
        private function next():Number {
            this.pointer = this.getNextPointer();
            return this.pointer;
        }

        /**
         * Start slide show
         */
        public function start():void {
            this.startShow();
        }

        /**
         * Start slide show to loop
         */
        private function startShow(e:TweenEvent = null):void {
            if (e != null) {
                this.firstSlide = false;
            }
            this.slideNow();
        }

        /**
         * Immediately fade out
         */
        private function slideNow():void {
            if (!this.firstSlide) {
                this.setChildIndex(this.slides[this.pointer], 0);
                this.slides[this.pointer].alpha = 1;
                this.next();
            }
            var fadeout:Tween = new Tween(this.slides[this.pointer], "alpha", Regular.easeOut, 1, 0, 2, true);
            fadeout.addEventListener(TweenEvent.MOTION_FINISH, startShow);
        }
    }
}

Tweenオブジェクトは生成すると移動やフェードを実装することができます。
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/fl/transitions/Tween.html

TweenオブジェクトはTweenEventで定義されたイベントを実装することができます。
これを利用してサンプルコードではTweenのモーションが完了した時点で次のフェードアウトを実行するようにしています。

これを呼び出すにはMain.asのコールバックメソッドを以下のように書き換えます。

// XMLDatabaseからのコールバック
public function callback(){
    var data = this.xmldb.getData();
    var slideShow:MovieClip = new SlideShow(data);
    this.addChild(slideShow);
    slideShow.start();
}