forked from: forked from: Tiling

by aobyrne forked from forked from: Tiling (diff: 286)
BitmapをやめてShapeにしてみた。
構造理解のため、そぎ落とせるところはそぎ落としている。

※ 止まりません。
♥0 | Line 308 | Modified 2011-07-06 13:33:59 | MIT License
play

ActionScript3 source code

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

// forked from whirlpower's forked from: Tiling
// forked from quqjp's Tiling
package 
{
    /*
    * BitmapをやめてShapeにしてみた。
    * 構造理解のため、そぎ落とせるところはそぎ落としている。
    *
    * ※ 止まりません。
    */

    import com.bit101.components.PushButton;
    import flash.display.*;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import frocessing.color.ColorHSV;
    public class Tiling extends Sprite
    {
        static public const TILE_SCALE:int = 15;
        private var mapLogic:MapLogic;
        private static var debugger:Debugger;
        private var csprite:Sprite;
        private var continueButton:PushButton;
        private var colorHSV:ColorHSV;
        private var counter:uint;
        private var tileAmount:int;
        private var psprite:Sprite;
        private var stopButton:PushButton;
        private var isStopped:Boolean;
        private var playButton:PushButton;
        private var stepButton:PushButton;
        
        public function Tiling():void
        {
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            
            debugger = new Debugger(this);
            stage.frameRate = 5;
            tileAmount = int(465 / TILE_SCALE);
            mapLogic = new MapLogic( tileAmount, tileAmount, 10, TILE_SCALE );
            mapLogic.mapSignal.add(drawMap);
            //mapLogic.lineSignal.add(onLineSignal);
            mapLogic.positionSignal.add(onPositionSignalHandler);
            mapLogic.emptyWidthSignal.add(onEmptyWidthSignalHandler);
            mapLogic.lengthChange.add(onMapChange);
            csprite = Sprite(addChild(new Sprite));
            addEventListener( Event.ENTER_FRAME, render );
            continueButton = new PushButton(this, 465, 500, 'continue', doContinue);
            stopButton = new PushButton(this, 565, 500, 'stop', doStop);
            playButton = new PushButton(this, 665, 500, 'play', doPlay);
            stepButton = new PushButton(this, 765, 500, 'step', doStep);
            continueButton.visible = false;
            //draw();
            colorHSV = new ColorHSV();
            psprite = Sprite(addChild(new Sprite));
        }
        
        private function doStep(e:Event):void 
        {
            render(null);
        }
        
        private function doPlay(e:Event):void 
        {
            isStopped = false;
            addEventListener(Event.ENTER_FRAME, render);
        }
        
        private function doStop(e:Event):void 
        {
            removeEventListener(Event.ENTER_FRAME, render);
            isStopped = true;
        }
        
        private function onEmptyWidthSignalHandler(emptyWidth:uint):void 
        {
            
        }
        
        private function onPositionSignalHandler(position:int):void 
        {
            var g:Graphics = psprite.graphics;
            //g.clear();
            g.lineStyle(0);
            g.beginFill(0);
            /*
            g.drawRect(
                position % tileAmount * TILE_SCALE + 1,
                uint(position / tileAmount) * TILE_SCALE + 1, 
                4, 
                4
            );
            */
            drawRectangleAt(g, position,4);
            g.endFill()
            
        }
        
        private function onMapChange():void 
        {
            removeEventListener( Event.ENTER_FRAME, render );
            continueButton.visible = true;
            var timer:Timer = new Timer(1000, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, afterMapChange, false, 0, true);
            if (!isStopped) timer.start();
        }
        
        private function afterMapChange(e:TimerEvent):void 
        {
            addEventListener(Event.ENTER_FRAME, render);
        }
        
        private function onLineSignal():void 
        {
            removeEventListener( Event.ENTER_FRAME, render );
            continueButton.visible = true;
        }
        
        private function doContinue(e:Event):void 
        {
            addEventListener( Event.ENTER_FRAME, render );
            continueButton.visible = false;
        }
        
        private function drawMap(map:Array):void 
        {
            colorHSV.h = (counter++)%360
            var g:Graphics = csprite.graphics;
            g.clear();
            g.lineStyle(0);
            g.beginFill(colorHSV.value);
            for (var i:int = 0; i < map.length; i++) 
            {
                var item:uint = map[i];
                drawRectangleAt(g,i,TILE_SCALE-2);
            }
        }
        
        private function drawRectangleAt(g:Graphics, i:int, size:Number):void 
        {
            g.drawRect(
                i % tileAmount * TILE_SCALE + 1,
                uint(i / tileAmount) * TILE_SCALE + 1, 
                size, 
                size
            );
        }
        
        
        static public function traceIt(msg:String):void 
        {
            debugger.traceThis(msg)
            
        }
        private function cTrace(msg:String):void 
        {
            traceIt(msg);
        }
        private function draw():void 
        {
            while (addChild( mapLogic.create() ).y<480) 
            {
                
            }
        }
        
        private function render( e:Event ):void
        {
            addChild( mapLogic.create() );
        }
    }
}

import com.bit101.components.PushButton;
import com.bit101.components.TextArea;
import com.bit101.components.VBox;
import flash.display.*;
import flash.events.Event;
import flash.text.TextField;
import idv.cjcat.signals.ISignal;
import idv.cjcat.signals.Signal;
    
internal class MapLogic
{
    private var _map:Array = [];
    private var gridW:int;
    private var gridH:int;
    private var tileMax:int;
    private var tileScale:int = 10;
    private var icount:uint;
    private var tiles:Vector.<Tile>;
    private var lineCounter:uint;
    private var mapLength:uint;
    private var mapIndex:uint;
    public  var emptyPos:int = 0;
    public var lengthChange:ISignal;
    public var mapSignal:ISignal;
    public var lineSignal:ISignal;
    public var positionSignal:ISignal;
    private var emptyWidth:int;
    private var position:int;
    public var emptyWidthSignal:ISignal;
    
    public function MapLogic( gridW:int, gridH:int, tileMax:int, tileScale:int ):void
    {
        this.gridW        = gridH;
        this.gridH        = gridW;
        this.tileMax        = tileMax;
        this.tileScale    = tileScale;
        mapSignal = new Signal(Array);
        lengthChange = new Signal();
        lineSignal = new Signal();
        tiles = Vector.<Tile>([]);
        positionSignal = new Signal(int);
        emptyWidthSignal = new Signal(int);
    }

    public function create():Tile
    {
        position = -1;
        emptyWidth = 0;
        icount = 0;
        
        for (mapIndex = emptyPos; mapIndex < emptyPos +500 ; mapIndex++ )
        //for ( var i:int = emptyPos; i < emptyPos +500 ; i++ )
        {
            ///*
            if (!setPosition()) 
            {
                break;
            }
            /*/
            icount++;
            if ( !_map[i] && position == -1 ){
                position = i;
                positionSignal.dispatch(position);
                emptyWidth++;
            } else if ( emptyWidth >= tileMax ){
                break;
            } else if ( !_map[i] && !( i % gridW == 0 && i != emptyPos ) ) {
                emptyWidth++;
            } else if ( position != -1 ) {
                break;
            }
            //*/
        }
        //cTrace( "i : " + i );
        cTrace( "mapIndex : " + mapIndex );
        cTrace( "emptyWidth : " + emptyWidth );
        cTrace( "_map.length : " + _map.length );
        cTrace( "icount : " + icount );
        var ww:int    = int( Math.random() * emptyWidth ) + 1;
        cTrace( "ww : " + ww );
        
        var p:int = position;
        cTrace( "p : " + p );
        for ( var yy:int = 0; yy < ww; yy++ ){
            for ( var xx:int = 0; xx < ww; xx++ ){
                _map[p] = 1;
                p++;
            }
            p += gridW - ww;
            var delta:Number = (gridW - ww);
        }
        cTrace( "delta : " + delta );
        trace( "_map : " + _map );
        mapSignal.dispatch(_map);
        if (_map.length!=mapLength) 
        {
            lengthChange.dispatch();
        }
        mapLength = _map.length
        emptyPos = position + ww;
        cTrace( "emptyPos : " + emptyPos );
        
        var px:int = position % gridW * tileScale;
        var py:int = position == 0 ? 0 : int( position / gridW ) * tileScale;
        cTrace( "(ww*ww) : " + (ww * ww) );
        if ( px==0) 
        {
            lineCounter++;
            lineSignal.dispatch();
        }
        var tile:Tile =       new Tile( px, py, ww * tileScale, ww * tileScale );    
        tiles[tiles.length] = tile;
        cTrace('---------------------------------------');
        return tile;
    }
     private function setPosition():Boolean 
    {
        var output:Boolean = true;
        icount++;
        cTrace( "icount : " + icount );
        if ( !_map[mapIndex] && position == -1 ){
            position = mapIndex;
            positionSignal.dispatch(position);
            emptyWidth++;
            emptyWidthSignal.dispatch(emptyWidth);
        } else if ( emptyWidth >= tileMax )
        {
            cTrace( "( emptyWidth >= tileMax ) : " + ( emptyWidth >= tileMax ) );
            output = false;
        } else if ( !_map[mapIndex] && !( mapIndex % gridW == 0 && mapIndex != emptyPos ) ) 
        {
            emptyWidth++;
            emptyWidthSignal.dispatch(emptyWidth);
        } else if ( position != -1 ) 
        {
            cTrace( "( position != -1 ) : " + ( position != -1 ) );
            output = false;
        }
        return output
    }   
    private function cTrace(arg1:String):void 
    {
        Tiling.traceIt(arg1);
    }
}

internal class Tile extends Shape
{
    public function Tile( _x:int, _y:int, _w:int, _h:int ):void
    {
        this.x = _x;
        this.y = _y;
        
        graphics.lineStyle( 1, 0x000000 );
        graphics.drawRect( 0, 0, _w, _h );
    }
}
class Debugger extends VBox
{
    private var _textField:TextField;
    private var _msprite:Sprite;
    public function Debugger(msprite:Sprite) 
    {
        super();
        _msprite = msprite;
        _msprite.addChild(this);
        addChildAt(new PushButton(null, 0, 0, "clear", doClear), numChildren);;
        var textArea:TextArea = new TextArea();
        addChildAt(textArea, numChildren);
        _textField = textArea.textField
        //textField.defaultTextFormat = new TextFormat("Lucida Console",11);
        x = 465;
        //border = true;
        textArea.setSize(465, 465);
    }
    
    private function doClear(e:Event):void 
    {
        _textField.text = "";
    }
    
    public function get textField():TextField 
    {
        return _textField;
    }
    
    public function set textField(value:TextField):void 
    {
        _textField = value;
    }
    
    public function traceThis(msg:String):void 
    {
        textField.appendText(msg + "\n");
        textField.scrollV = textField.maxScrollV;
        
    }
}