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

forked from: PathResolver base

Get Adobe Flash player
by coolljp 31 Aug 2010
    Embed
/**
 * Copyright coolljp ( http://wonderfl.net/user/coolljp )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/vIro
 */

// forked from snamura's PathResolver base
package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.setTimeout;
    
    [SWF(width="465",height="465",frameRate="24",backgroundColor="#ffffff")]
    public class PathResolveBase extends Sprite
    {
        private var _text:TextField;
        
        // 経路計算テスト用マップのための配列
        // とりあえず正方形のみ
        // 0 = 通路
        // 1 = スタート地点
        // 2 = ゴール地点
        // 8 = 壁
        private var map:Array = [
            1, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0,
            0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0,
            0, 8, 0, 8, 0, 0, 8, 0, 8, 8, 8, 8, 8, 8, 8, 0,
            0, 8, 0, 8, 0, 8, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 8, 0, 0, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8,
            8, 8, 8, 8, 0, 0, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 8, 0, 0, 8, 0, 8, 8, 8, 8, 8, 0,
            0, 0, 0, 8, 8, 0, 0, 8, 0, 0, 8, 0, 0, 8, 0, 0,
            0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8,
            8, 8, 0, 8, 8, 8, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0,
            0, 0, 0, 0, 0, 8, 0, 8, 8, 0, 0, 0, 8, 0, 0, 0,
            0, 0, 0, 8, 0, 8, 0, 0, 8, 0, 8, 8, 8, 0, 8, 8,
            8, 8, 8, 0, 0, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 8, 8, 0, 0, 8, 0,
            0, 0, 8, 8, 0, 0, 8, 0, 0, 0, 8, 0, 8, 8, 8, 0,
            0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 8, 2
        ];
        
        // フィールドの大きさ(1辺のノード数)
        private var fieldLength:int;
        
        
        // スタート地点
        private var start:Node;
        
        // ゴール地点
        private var goal:Node;
        
        // ノード配列
        private var nodes:Array = [
        ];
        
        public function PathResolveBase()
        {
            initNodes();
            drawPath();
        }
        
        /**
         * 初期ノードを構成します。
         */
        private function initNodes():void
        {
            // 正方形を前提としてノードの幅を取得
            fieldLength = Math.sqrt(map.length);
            for (var x:int = 0; x < fieldLength; x++)
            {
                for (var y:int = 0; y < fieldLength; y++)
                {
                    // ノードの配列番号を取得
                    var index:int = x + y * fieldLength;
                    // ノードの種類を取得
                    var type:int = map[index];
                    var node:Node = new Node(x, y, true);
                    if (type == 8)
                    {
                        // 壁タイプ
                        node.walkable = false;
                        node.draw(0x333333);
                    }
                    else
                    {
                        // 通行可能タイプ
                        if (type == 1)
                        {
                            // スタート地点
                            start = node;
                            node.draw(0xcc6666);
                        }
                        else if (type == 2)
                        {
                            // ゴール地点
                            goal = node;
                            node.draw(0x66cc66);
                        }
                        else
                        {
                            node.draw(0xffffff);
                        }
                    }
                    nodes[index] = node;
                    addChild(node);
                }
            }
        }
        
        /**
         * 最短経路を取得し、経路を色づけします。
         */
        private function drawPath():void
        {
            var path:Array = resolvePath();
            for (var i:int = 0; i < path.length; i++)
            {
                var node:Node = path[i];
                setTimeout(node.draw, i * 100, 0xcc9999);
            }
        }
        
        /**
         * スタート地点からゴール地点までの最短経路を計算し、
         * 経路となるノードの配列を返却します。
         */
        private function resolvePath():Array
        {
            // 手動による計算。最短経路を求めるアルゴリズムに変更します。
            return state1;
        }
        
        
        /**

         */
        private function state1(x:int, y:int):Array
        {
            //x+1 y+1 x-1 y-1
            return [
                nodes[16],nodes[31],nodes[48],nodes[64],nodes[65],nodes[66],nodes[50],nodes[34],nodes[18],
                nodes[19],nodes[20],nodes[36],nodes[52],nodes[68],nodes[84],nodes[100],nodes[99],nodes[98],
                nodes[114],nodes[130],nodes[146],nodes[162],nodes[163],nodes[164],nodes[180],nodes[196],
                nodes[195],nodes[211],nodes[210],nodes[209],nodes[225],nodes[241],nodes[242],nodes[243],
                nodes[244],nodes[245],nodes[229],nodes[213],nodes[214],nodes[215],nodes[231],nodes[232],
                nodes[233],nodes[217],nodes[201],nodes[202],nodes[203],nodes[204],nodes[205],nodes[206],
                nodes[207],nodes[223],nodes[239]

            ];
        }
        
        /**
         * 指定位置のノードを取得します。
         */
        private function getNode(x:int, y:int):Node
        {
            return nodes[x + y * fieldLength];
        }
    }
    
}

import flash.display.Sprite;
import flash.events.EventDispatcher;

// 経路探索のためのノードクラス
internal class Node extends Sprite {
    
    internal var fieldX:int;
    internal var fieldY:int;
    internal var walkable:Boolean;
    
    public function Node(fieldX:int, fieldY:int, walkable:Boolean)
    {
        this.fieldX = fieldX;
        this.fieldY = fieldY;
        this.walkable = walkable;
        this.x = fieldX * 20 + 70;
        this.y = fieldY * 20 + 70;
    }
    
    internal function draw(background:uint):void
    {
        graphics.clear();
        graphics.lineStyle(1);
        graphics.beginFill(background);
        graphics.drawRect(0,0,20,20);
    }
}