In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

15 puzzle Slideshow for Christmas

15 puzzle のスライドショーです。

パズルの解法は9パターン
画像は29枚用意してあります。
BGMはきよしこのよる、ジングルベルです。
プログラムを起動したときにランダムに決まります。

写真はFlickrから拝借しています。
BGMは、フリー音楽素材 - SHWフリー音楽素材  http://shw.in/about/ から拝借しました。

素敵な写真と音楽ですね☆

Merry Christmas!!
Get Adobe Flash player
by WinField95 17 Nov 2012
    Embed
/**
 * Copyright WinField95 ( http://wonderfl.net/user/WinField95 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yb4D
 */

package

{

    import flash.display.Loader;

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.geom.Matrix;

    import flash.media.Sound;

    import flash.net.URLRequest;

    import flash.system.LoaderContext;

    import flash.system.Security;

    import mx.modules.ModuleManagerGlobals;

    import mx.resources.IResourceManager;

 

    import flash.display.Bitmap;

    import flash.display.BitmapData;

    import flash.display.Sprite;

    import flash.geom.Point;

    import flash.geom.Rectangle;

    

        

    import flash.text.TextFormat;

    import flash.filters.GlowFilter

    import flash.text.TextField;

    

    [SWF(frameRate = "30")] // 1 / 30 秒おきにmainLoopを呼び出す。

    

    public class Main extends Sprite

    {

    

        public static const WIDTH:int = 4;

        public static const HEIGHT:int = 4;

        

        

        // プログラムの状態 mainLoop で使用

        public static const INIT:int = 1;

        public static const PREPARE:int = 2;

        public static const CHECK:int = 3;

        public static const MOVE:int = 4;

        public static const END:int = 5;

        public static const DISPLAY:int = 6;

        

        // 画像を表示するフレーム数

        public static const DISPLAYFRAME:int = 300;

        public var frame:int;

        

        //方向ベクトル

        public static const dx:Array = [0,1,0,-1];

        public static const dy:Array = [-1,0,1,0];

        

        private var count:int = 0;    // 読み込んだ画像数

        private var images:Array;    // 読み込んだ画像

        private var imgBitmapdata:BitmapData; // 読み込んだ画像のビットマップ

        private var imgPreBitmapdata:BitmapData // 前回読み込んだ画像のビットマップ

        private var imgBitmap:Bitmap; // 読み込んだ画像のビットマップ

        private var imgPreBitmap:Bitmap // 前回読み込んだ画像のビットマップ

        private var pieces:Array;   // パズルのピースの集合

        private var mainState:int       // Mainの現在の状態

        private var puzzleState:Array     // パズルの現在の状態

        private var moveID             // 移動するべきピースのID

        private var startPoint:Point // 移動時の開始座標

        private var nextPoint:Point // 移動時の目標座標

        private var v:Number;   // 速度

        private var a:Number;   // 加速度

        private var diff:Number; // 移動距離

        private var direction1:int; // 移動方向

        private var direction2:int; // 移動方向

        private var solvePath:SolvePath; // パズルの解法

        private var backGround:Sprite; // 背景

        

        //private var rotateImages:Array;

        

        private var snows:Array; // 雪のインスタンスを管理

        //private var canvas:BitmapData; // これに雪を描く。

        

        private var textBitmap:Bitmap; // メリークリスマス

        

        private var sound1:Sound // BGM1

        private var sound2:Sound // BGM2

        

        //private var test: Sprite; // TEST

        

        private var now:int // 現在の画像のID

        // 画像のダウンロード元、主にflickrから拝借。

        private    const IMAGE_URL:Array =

        [    

            "http://farm1.staticflickr.com/133/331473239_22148d35db.jpg" ,

            "http://farm4.staticflickr.com/3505/5736699497_4775913884.jpg" ,

            "http://farm2.staticflickr.com/1106/5149207717_aa0dd823c1.jpg",

            "http://farm8.staticflickr.com/7147/6689855801_6f5f08fd58.jpg",

            "http://farm8.staticflickr.com/7166/6689869671_74d85f8ffa.jpg" ,

            "http://farm6.staticflickr.com/5242/5298952146_b1540741dd.jpg",

            "http://farm4.staticflickr.com/3292/3123211582_4531cd0676.jpg" ,

            "http://farm6.staticflickr.com/5029/5670924229_1937294879.jpg",

            "http://farm3.staticflickr.com/2638/4128207576_91e43a03ba.jpg",

            "http://farm7.staticflickr.com/6105/6369270209_8f1bfd520a.jpg",

            "http://farm7.staticflickr.com/6104/6377293823_cac1cda804.jpg",

            "http://farm9.staticflickr.com/8202/8183862967_12dbf046e3.jpg",

            "http://farm6.staticflickr.com/5282/5253681277_78170e59e6.jpg",

            "http://farm6.staticflickr.com/5129/5257528268_b16d04667b.jpg",

            "http://farm5.staticflickr.com/4014/4206431435_269922e16f.jpg",

            "http://farm6.staticflickr.com/5045/5270600203_d153f03ccb.jpg",            

            "http://farm9.staticflickr.com/8204/8187687440_fb06453b35.jpg",

            "http://farm6.staticflickr.com/5047/5302051252_c17449bea3.jpg" ,

            "http://farm1.staticflickr.com/3/3796790_917c4ac3b4.jpg" ,

            "http://farm7.staticflickr.com/6107/6340228795_41f21660be.jpg",

            "http://farm8.staticflickr.com/7164/6538514229_9044b63f21.jpg",

            "http://farm1.staticflickr.com/134/370621720_8f41f08a25.jpg",

            "http://farm3.static.flickr.com/2205/2532926223_6b2745185b.jpg",

            "http://farm5.staticflickr.com/4148/5040639634_ceb56bcb2e.jpg",

            "http://farm1.staticflickr.com/32/54527751_ffae06bf62.jpg",

            "http://farm3.staticflickr.com/2527/4165552937_db6778bb09.jpg",

            "http://farm6.staticflickr.com/5083/5259436844_3d5c24535f.jpg",

            "http://farm8.staticflickr.com/7167/6559867027_45751b3915.jpg",

            "http://farm6.staticflickr.com/5128/5276992365_b12ecf6b64.jpg" ,

                        

            //おまけ

            //"http://farm9.staticflickr.com/8345/8189180209_b705c1a466_b.jpg",

        ];

 

        public function Main()

        {

            

            // 背景を描く

            backGround = new Sprite();

            backGround.graphics.beginFill(0xF);

            backGround.graphics.drawRect(0, 0, 465, 465);

            backGround.graphics.endFill();

            addChild(backGround);



            snows = new Array();

            

            images = new Array(IMAGE_URL.length);

            

            // crossdomain.xmlを読み込む

            Security.loadPolicyFile("http://farm3.static.flickr.com/crossdomain.xml");

            for (var i:int = 0; i < IMAGE_URL.length; i++)

            {

                var loader:Loader = new Loader();

                loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);

                loader.load(new URLRequest(IMAGE_URL[i]), new LoaderContext(true));

                loader.name = i.toString();

            }

            

            // BGMを読み込む  フリー音楽素材 - SHWフリー音楽素材  http://shw.in/about/

            sound1 = new Sound(new URLRequest("http://shw.in/sozai/audio120402/xmas-jinglebell1-short.mp3")); // ジングルベル

            sound2 = new Sound(new URLRequest("http://shw.in/sozai/audio120402/xmas-kiyoshikonoyoru1.mp3")); // きよしこのよる

            

            //sound.play(0, 100);

            if (Math.floor(Math.random()*2) == 0) sound1.play(0,100);

            else sound2.play(0,100);

        }

 

        private function initHandler(event:Event):void

        {    

            var loader:Loader = event.currentTarget.loader;

            var matrix:Matrix = new Matrix();

            matrix.scale(465 / loader.width, 465 / loader.height);

            

            var bd:BitmapData = new BitmapData(465,465);

            bd.draw(loader,matrix);

            

            images[event.currentTarget.loader.name] = bd;

            if (++count == IMAGE_URL.length) completeHandler();

        }

 

        private function completeHandler():void

        {

            /*

            // メリークリスマスを書く。

            textBitmap = new Bitmap();

            //textBitmap = Text.textToBitmap("メリークリスマス",30,0xFFFFFF));

            textBitmap = Text.textToBitmap(Text.createTextField("Merry Christmas",30,0xFFFFFF));

            textBitmap.x = 75;

            textBitmap.y = 410;

            textBitmap.filters = [new GlowFilter(0xFFFFFF, 1, 6, 6, 1, 3,false,false)];

            addChild(textBitmap);

            */

            

            images = shuffle(images); // イメージデータの順番をシャッフル

            

            mainState = INIT;

            imgPreBitmapdata = new BitmapData(Piece.SIZE*Piece.WIDTH,Piece.SIZE*Piece.HEIGHT,false,0x0);

            

            // 最初に消す用のピースを用意しておく。

            pieces = new Array();

            for (var i:int = 0 ; i < 16 ; i++) {

                var bd:BitmapData = new BitmapData(Piece.SIZE,Piece.SIZE, false);

                bd.copyPixels(imgPreBitmapdata, new Rectangle((int)(i%4)*Piece.SIZE,(int)(i/4)*Piece.SIZE,Piece.SIZE, Piece.SIZE), new Point());

                //addChild(new Bitmap(bd));

                var piece:Piece = new Piece(bd, i);

                var id:int;

                if (i + 1 == 16) id = 0;

                else id = i + 1;

                pieces[id] = piece;

                addChild(pieces[id]);

                pieces[id].visible = false;

            }

            addEventListener(Event.ENTER_FRAME,mainLoop);

        }



        // メインループ

        private function mainLoop(event:Event):void{

                

            updateSnow();



            switch(mainState) {

                case INIT:

                    init();

                    break;

                case PREPARE:

                    prepare();

                    break;

                case CHECK:

                    check();

                    break;

                case MOVE:

                    move();

                    break;

                case END:

                    end();

                    break;

                case DISPLAY:

                    display();

                    break;

                }

        }

        

        // 雪の動きを更新する。

        private function updateSnow():void {

            

            for (var i:int = 0 ; i < snows.length ; i++) {

                snows[i].move();

            }

            // 雪を一粒生成する。 インスタンスを生成するのは200粒まで。

            if(snows.length < 200)emitParticle(Math.random() * 465, 0, Math.random() + 0.5);

        }



        // 雪を 1 粒発生させる関数

        public function emitParticle(ex:Number, ey:Number, s:Number = 1, c:int = 0xffffff, vx:Number = 0, vy:Number = 0):void {

            var p:SnowParticle = new SnowParticle(ex,ey,vx,vy,s,c);  // 雪の粒のインスタンスを作成。

            

            addChild(p);

            snows.push(p); // 保存

        }

        

        //前回の画像を徐々に薄くしていく。

        private function prepare():void {

            imgPreBitmap.alpha = Math.max(imgPreBitmap.alpha - 0.001,0.0);

            if (imgPreBitmap.alpha == 0.0) mainState = CHECK;

        }

        

        // 初期化を行う。

        private function init():void {

        

            // 前回のピースの表示を解除

            for (var i:int = 0 ; i < 16 ; i++) {

                    removeChild(pieces[i]);

            }

            

            solvePath = SolvePathManager.getInstance().getSolvePath();



            puzzleState = new Array();

            solvePath.getInitState(puzzleState);

            

            for (var i = 0 ; i < Piece.HEIGHT ; i++) {

                for ( var j = 0 ; j < Piece.WIDTH ; j++){

                    trace(puzzleState[i][j]);

                }

            }

            

            imgBitmapdata = new BitmapData(Piece.HEIGHT*Piece.SIZE,Piece.WIDTH*Piece.SIZE);

            imgBitmapdata.draw(images[now]);

            now = (now + 1) % images.length;

            

            pieces = new Array();

            

            for (var i:int = 0 ; i < 16 ; i++) {

                var bd:BitmapData = new BitmapData(Piece.SIZE,Piece.SIZE, false);

                bd.copyPixels(imgBitmapdata, new Rectangle((int)(i%4)*Piece.SIZE,(int)(i/4)*Piece.SIZE,Piece.SIZE, Piece.SIZE), new Point());

                var piece:Piece = new Piece(bd, i);

                var id:int;

                if (i + 1 == 16) id = 0;

                else id = i + 1;

                pieces[id] = piece;

            }

            

            // ピースを初期値に置いていく。



            for (var i:int = 0 ; i < 4 ; i++) {

                for (var j:int = 0 ; j < 4 ; j++) {

                    var id:int = puzzleState[i][j];

                    pieces[id].x = j*Piece.SIZE;

                    pieces[id].y = i*Piece.SIZE;

                    addChild(pieces[id]);

                }

            }

            

            // 0番目のピースを非表示にする

            pieces[0].visible = false;

            pieces[0].frame.alpha = 0.0;

            pieces[0].alpha = 0.0;

            

            // imgPreBitmapに画像データを格納

            imgPreBitmap = new Bitmap(imgPreBitmapdata);

            addChild(imgPreBitmap);

            // imgBitmapに画像データを格納

            imgBitmap = new Bitmap(imgBitmapdata);

            imgPreBitmapdata = imgBitmapdata;

            

            mainState = PREPARE;

            

        }

        

        

        /*

         * check関数

         * 

         * パズルが完成したかどうかの確認。

         * 移動するべきピースとその方向を確認。

         * パズルの状態の更新

         * 

        */

        

        private function check():void{

            direction1 = solvePath.getMoveDirection();

            direction2 = (direction1 + 2) % 4;

            if (direction1 == -1) {

                mainState = END;

                return;

            }

            

            startPoint = new Point(pieces[0].x/Piece.SIZE + dx[direction1] , pieces[0].y/Piece.SIZE + dy[direction1]);

            nextPoint = new Point(pieces[0].x/Piece.SIZE,pieces[0].y/Piece.SIZE);

            

            trace("nextPoint");//

            trace(startPoint.x);

            trace(startPoint.y);

            trace("direction1 = " + direction1);

            

            moveID = puzzleState[startPoint.y][startPoint.x];

            trace(puzzleState[startPoint.y][startPoint.x]);

            

            // swap

            var tmp:int = puzzleState[nextPoint.y][nextPoint.x];

            puzzleState[nextPoint.y][nextPoint.x] = puzzleState[startPoint.y][startPoint.x];

            puzzleState[startPoint.y][startPoint.x] = tmp;

            

            trace(puzzleState[startPoint.y][startPoint.x]);

            v = 3.0;

            a = 0.1;

            diff = 0.0;

            

            mainState = MOVE;

        }

        

        private function move():void {

            

            v += a;

            

            diff += Math.abs(dx[direction1] * v + dy[direction1] * v);

            diff = Math.min(diff,Piece.SIZE);

            

            if (diff == Piece.SIZE) {

                

                pieces[moveID].x = nextPoint.x * Piece.SIZE;

                pieces[moveID].y = nextPoint.y * Piece.SIZE;

                

                pieces[0].x = startPoint.x * Piece.SIZE;

                pieces[0].y = startPoint.y * Piece.SIZE;

                

                mainState = CHECK;

                return;

            }

            

            pieces[moveID].x += v * dx[direction2];

            pieces[moveID].y += v * dy[direction2]



            pieces[0].x += v * dx[direction1];

            pieces[0].y += v * dy[direction1];

                        

        }

        

        private function end():void {

            // 0番目のピースを表示する

            if(pieces[0].visible == false){

                pieces[0].visible = true;

            }

                

            //徐々にフレームと数字を薄くしていく。

            for (var i:int = 0 ; i < 16 ; i++) {

                pieces[i].frame.alpha = Math.max(pieces[i].frame.alpha - 0.005, 0.0);

                pieces[i].bitmap.alpha = Math.max(pieces[i].frame.alpha - 0.005, 0.0);                

            }

            pieces[0].alpha = Math.min(pieces[0].alpha + 0.01,1.0);

            

            if (pieces[0].alpha == 1.0) {

                frame = 0;

                mainState = DISPLAY;

            }

            

        }

                        

        private function display():void {

            frame++;

            if (frame > DISPLAYFRAME) {

                mainState = INIT;

            }

        }

        

                

        //配列をランダムにソートしてシャッフル

                

        private function shuffle(data:Array):Array{

            var temp:Array = data.slice();

            var dest:Array = new Array();

 

            while (temp.length > 0)

            {

                var index:int = Math.random() * temp.length;

                dest.push(temp[index]);

                temp.splice(index, 1);

            }        

            return dest;

        }

        

        

    }

}



import flash.text.TextField;

import flash.display.Sprite;

import flash.display.Bitmap;

import flash.display.BitmapData;

import flash.text.TextFormat;

import flash.filters.GlowFilter;



class Piece extends Sprite

{

    

    public static const WIDTH:int = 4;            // 幅

    public static const HEIGHT:int = 4;            // 高さ        

    public static const LENGTH:int = WIDTH * HEIGHT;    // ピースの数(空白含む)

    public static const LAST:int = WIDTH * HEIGHT - 1;    // ピースの数(空白含まない)

    public static const SIZE:int = 116;            // 一つあたりのピースサイズ

    

    public var frame:Sprite;

    public var bitmap:Bitmap;

    public var number:int;

    

    

    public function Piece(bd:BitmapData, number:int)

    {

        

        addChild(new Bitmap(bd));

        

        // 枠を表示

        frame = new Sprite();

        //frame.graphics.lineStyle(2.0);

        frame.graphics.beginFill(0x0);

        frame.graphics.drawRect(0, 0, width, height);

        frame.filters = [new GlowFilter(0xFFFFFF, 1.0, 20, 20, 1, 1, true,true)];

        frame.graphics.endFill();

        

        addChild(frame);

        

        this.number = number;

        bitmap = Text.textToBitmap(Text.createTextField((number+1).toString(),30,0x0));

        bitmap.filters = [new GlowFilter(0xFFFFFF, 1, 6, 6, 1, 3,false,false)];

        bitmap.y = (height - bitmap.height) / 2;

        bitmap.x = (width - bitmap.width) / 2;

        addChild(bitmap);

     }

}



// Singleton

final class SolvePathManager {  

    private static var solvePaths:Array // 解法データの集合

    private static var id:int // 現在の解法データのID    

    private static var instance:SolvePathManager; // インスタンス

    

    public function SolvePathManager(){



        solvePaths = new Array(); 

        

        // C++の反復深化法のアルゴリズムを用いたプログラムの出力結果:解法の手順と、初期状態、の何個かを利用。

        

        var path:Array = [0, 3, 3, 0, 1, 2, 2, 3, 0, 1, 2, 1, 0, 0, 3, 0, 3, 2, 2, 3, 0, 0, 1, 2, 3, 0, 1, 1, 1, 2, 3, 3, 0, 1, 1, 2, 3, 3, 2, 1, 1, 0, 3, 3, 2, 3, 2, 1, 0, 1, 2, 1, 0, 0, 3, 2, 1, 2];

        var initState:Array = [[12, 11, 4, 2], 

                                [14, 13, 5, 10], 

                                [8, 3, 15, 7], 

                                [9, 6, 1, 0]];

                                

        solvePaths.push(new SolvePath(path, initState));    

        

        var path:Array = [0, 3, 3, 2, 2, 3, 0, 0, 1, 1, 0, 1, 2, 2, 3, 3, 0, 0, 3, 2, 2, 1, 1, 0, 0, 3, 2, 2, 2, 3, 0, 0, 1, 2, 1, 0, 0, 1, 2, 2, 2, 3, 0, 1, 0, 3, 2, 1, 2];

        var initState:Array = [[8, 2, 10, 15], 

                                [9, 13, 3, 4], 

                                [14, 1, 11, 0], 

                                [6, 5, 12, 7]];

        

        solvePaths.push(new SolvePath(path,initState));    

                            

        var path:Array = [0, 0, 0, 3, 3, 3, 2, 1, 2, 2, 1, 1, 0, 0, 3, 0, 3, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 3, 3, 0, 0, 0, 1, 2, 2, 2, 3, 0, 0, 1, 2, 1, 1, 2];

        var initState:Array = [[8, 2, 3, 10], 

                                [9, 13, 4, 11], 

                                [14, 1, 7, 12], 

                                [6, 5, 15, 0]];

                                

        solvePaths.push(new SolvePath(path,initState));



        var path:Array = [1, 0, 0, 3, 2, 3, 0, 3, 2, 1, 2, 2, 3, 0, 0, 1, 0, 3, 2, 2, 1, 1, 1, 0, 3, 3, 2, 1, 2, 1, 0, 0, 3, 2, 2, 1, 0, 0, 3, 2, 1, 2];

        var initState:Array = [[11, 5, 4, 15], 

                                [2, 12, 3, 10], 

                                [13, 1, 0, 6], 

                                [14, 9, 8, 7]];

                                

        solvePaths.push(new SolvePath(path,initState));



        var path:Array = [0, 3, 3, 2, 1, 1, 0, 3, 3, 2, 1, 1, 0, 0, 3, 3, 0, 3, 2, 2, 1, 1, 0, 0, 3, 3, 2, 1, 1, 1, 0, 3, 3, 2, 2, 1, 1, 0, 3, 2, 2, 1];

        var initState:Array = [[4, 5, 2, 12], 

                                [3, 10, 8, 7], 

                                [1, 15, 11, 14], 

                                [13, 6, 9, 0]];

                                

        solvePaths.push(new SolvePath(path,initState));

        

        var path:Array = [0, 1, 2, 1, 0, 0, 3, 2, 1, 0, 1, 2, 2, 3, 0, 1, 2, 3, 3, 0, 1, 0, 0, 3, 3, 2, 1, 2, 1, 0, 0, 1, 2, 2, 3, 0, 0, 3, 3, 2, 2, 1, 1, 1, 2];



        var initState:Array = [[3, 10, 11, 7],

                                [2, 12, 14, 9],

                                [13, 5, 8, 4],

                                [0, 1, 15, 6]];

                                

        solvePaths.push(new SolvePath(path, initState));

        

        var path:Array = [0, 0, 3, 0, 3, 2, 1, 2, 3, 0, 1, 2, 2, 3, 0, 1, 1, 0, 3, 0, 3, 2, 3, 0, 1, 2, 2, 1, 2, 3, 0, 3, 0, 1, 1, 2, 2, 3, 0, 0, 1, 2, 1, 2];



        var initState:Array = [[9, 10, 7, 4],

                                [2, 3, 11, 15], 

                                [14, 8, 1, 12], 

                                [13, 6, 5, 0]];

                                                                

        solvePaths.push(new SolvePath(path,initState));

        



        var path:Array = [2, 3, 0, 0, 1, 2, 3, 3, 0, 0, 3, 2, 1, 2, 3, 0, 1, 0, 1, 1, 2, 2, 3, 3, 2, 3, 0, 1, 0, 1, 2, 2, 3, 0, 0, 1, 0, 3, 2, 1, 2, 2, 1, 0, 0, 3, 2, 1, 2];



        var initState:Array = [[14, 13, 3, 6],

                                [1, 5, 11, 10], 

                                [2, 12, 8, 0],

                                [7, 9, 15, 4]];

                                                                

        solvePaths.push(new SolvePath(path,initState));



        

        

        var path:Array = [3, 3, 3, 0, 0, 1, 2, 1, 0, 3, 0, 3, 2, 2, 1, 2, 1, 0, 3, 0, 3, 0, 1, 2, 1, 0, 1, 2, 2, 3, 3, 2, 1, 0, 0, 3, 2, 3, 2, 1, 1, 1];



        var initState:Array = [[1, 14, 11, 3], 

                                [2, 5, 13, 4], 

                                [9, 7, 10, 8], 

                                [12, 6, 15, 0]];

                                                                

        solvePaths.push(new SolvePath(path,initState));

        

        // パズルの解法をシャッフル

        solvePaths = shuffle(solvePaths);

        

    }

    

    // パズルの解法を取得。

    public function getSolvePath():SolvePath{

        if (id == solvePaths.length) id = 0;

        return solvePaths[id++];

    }

        

    // SolvePathManagerのインスタンスを取得。

    public static function getInstance():SolvePathManager {

        if (instance == null) instance = new SolvePathManager();

        return instance;

    }

    

            

        //配列をランダムにソートしてシャッフル

                

    private function shuffle(data:Array):Array{

        var temp:Array = data.slice();

        var dest:Array = new Array();

 

        while (temp.length > 0)

        {

            var index:int = Math.random() * temp.length;

            dest.push(temp[index]);

            temp.splice(index, 1);

        }        

        return dest;

    }    

}





// パズルの解法手順と、初期状態を管理

class SolvePath {

    private var path:Array;

    private var initState:Array;

    private var cnt:int;

    

    public function SolvePath(_path:Array,_initState:Array) {

        path = _path;

        initState = _initState;

        init();

    }

    

    public function init():void {

        cnt = 0;

    }

    

    public function getInitState(state:Array):void{



        for (var i = 0 ; i < Piece.HEIGHT ; i++) {

            var tmp:Array = new Array();

            for (var j = 0 ; j < Piece.WIDTH ; j++) {

                tmp.push(initState[i][j]);

            }

            state.push(tmp);

        }

        

    }

    

    public function getMoveDirection():int {

        if (cnt >= path.length) {

            init();

            return -1;

        }

        return path[cnt++];

    }

    

}



import flash.display.Bitmap;

import flash.display.BitmapData;

import flash.text.TextField;

import flash.text.TextFormat;

 

class Text

{

    public static function createTextField(text:String, size:int, color:int):TextField

    {

        var tf:TextField = new TextField();

        tf.defaultTextFormat = new TextFormat("_typeWriter", size, color, true);

        tf.text = text;

        tf.autoSize = "left";

        tf.selectable = false;

 

        return tf;

    }

 

    public static function textToBitmap(tf:TextField, transparent:Boolean = true):Bitmap

    {

        var bd:BitmapData = new BitmapData(tf.width, tf.height, transparent, 0x0);

        bd.draw(tf);

 

        return new Bitmap(bd);

    }

}

 

import flash.display.Sprite;

import flash.display.Bitmap;

import flash.display.BitmapData;

import flash.filters.GlowFilter;



// 雪の粒



class SnowParticle extends Sprite{

    

    private static const G:Number = 0.05; // 重力加速度

    

    private var vx:Number; // x方向の速度

    private var vy:Number; // y方向の速度

    private var s:Number;  // 現在のスピード

    private var c:int;     // 雪の色

    private var grow_c:int; // キラキラの色

    private var sp:Sprite; // 雪のSprite

    

    public function SnowParticle(ex:Number,ey:Number,vx:Number,vy:Number,s:Number,c:int){

        

         // パラメータ設定

        this.x = ex;

        this.y = ey;

        this.vx = vx;

        this.vy = vy;

        this.s = s;

        this.c = c;



        sp = new Sprite();

        sp.graphics.beginFill(c);

        

        // ランダムに大きさを決定する。

        s = Math.floor(3*Math.random()) + 1;

        

        sp.graphics.drawRect(0, 0, s, s);

        sp.graphics.endFill();

        

        // ランダムにキラキラの色を決定する。

        var rand:int = Math.floor(5*Math.random());

        if (rand == 0)grow_c = 0xFFFFFF;

        else if (rand == 1)grow_c = 0xFF0000;

        else if (rand == 2)grow_c = 0x00FF00;

        else if (rand == 3)grow_c = 0x0000FF;

        else if (rand == 4)grow_c = 0xFFFF00;

        sp.filters = [new GlowFilter(grow_c, 1, 6, 6, 5, 3,false,false)]; // キラキラを描く

                

        addChild(sp);

    }

    

    public function move():void {    

        vy += G * s; // 重力を加える

        vx += 2.0*Math.random()-1.0;

        

        y += vy; // 動かす

        x += vx;

        

        parent.addChildAt(this, parent.numChildren - 1);

            

        if (y > 465) { //画面外にでたら再利用する。

            

            x = Math.random() * 465;

            y = 0;//, Math.random() + 0.5);

            vx = 0.0;

            vy = 0.0;

        

        }

    }

}