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

Dot Editor

20×20のエリア内にドットをうち、それぞれのマスに関して塗られている(=1)塗られていない(=0)を判断して、その結果を配列に出力します。
出力された配列を元に、ファンクション「setBmpData」内でビットマップを描画しています。
単色のドット絵であれば、出力結果の配列を読み込んで、それを元に描画すれば、AS上で使用することができます。
/**
 * Copyright goodbyegirl1974 ( http://wonderfl.net/user/goodbyegirl1974 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8aHr
 */

package {
    import flash.utils.ByteArray;
    import flash.geom.Rectangle;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.MouseEvent;
    import flash.display.Sprite;
    import fl.controls.Button;
    public class DotEditor extends Sprite {
        public static const MODE_DRAW:String = "draw";
        public static const MODE_ERASE:String = "erase";
        public static const MODE_RESET:String = "reset";
        private var _horizonalGridNum:int = 20;
        private var _verticalGridNum:int = 20;
        private var _gridWidth:Number = 20.0;
        private var _gridHeight:Number = 20.0;
        private var _mouseDownFlg:Boolean = false;
        private var _mode:String = DotEditor.MODE_DRAW;
        private var _allGridArray:Array = [];
        private var _modePointer:Sprite;
        private var _outPutWindow:Sprite;
        private var _outPutTextField:TextField;
        private var _outPutBitMap:Bitmap;
        /**
        *    コンストラクタ。
        **/
        public function DotEditor() {
            // write as3 code here..
            init();
        }
        
        private function init():void
        {
            //とりあえず、20×20のグリッドを表示。
            var i:int = 0;
            for(i; i < _verticalGridNum; i++)
            {
                var j:int = 0;
                var targetArray:Array = [];
                for(j; j < _horizonalGridNum; j++)
                {
                    var sprite:GridSprite = new GridSprite(_gridWidth, _gridHeight);
                    sprite.x = _gridWidth * j;
                    sprite.y = _gridHeight * i;
                    addChild(sprite);
                    sprite.addEventListener(MouseEvent.MOUSE_DOWN, gridMouseDownHandler);
                    sprite.addEventListener(MouseEvent.MOUSE_UP, gridMouseUpHandler);
                    sprite.addEventListener(MouseEvent.ROLL_OVER, gridRollOverFunction);
                    stage.addEventListener(MouseEvent.MOUSE_UP, gridMouseUpHandler);
                    targetArray.push(sprite);
                }
                this._allGridArray.push(targetArray);
            }
            //ボタンを3つ配置。
            var drawButton:Sprite = makeBtn(80, 20, "描画");
            drawButton.x = 40;
            drawButton.y = 420;
            addChild(drawButton);
            drawButton.addEventListener(MouseEvent.CLICK, modeButtonClickHandler);
            var eraseButton:Sprite = makeBtn(80, 20, "消去");
            eraseButton.x = 140;
            eraseButton.y = 420;
            addChild(eraseButton);
            eraseButton.addEventListener(MouseEvent.CLICK, modeButtonClickHandler);
            var resetButton:Sprite = makeBtn(80, 20, "リセット");
            resetButton.x = 240;
            resetButton.y = 420;
            addChild(resetButton);
            resetButton.addEventListener(MouseEvent.CLICK, modeButtonClickHandler);
            drawButton.name = DotEditor.MODE_DRAW;
            eraseButton.name = DotEditor.MODE_ERASE;
            resetButton.name = DotEditor.MODE_RESET;
            _modePointer = new Sprite();
            _modePointer.graphics.lineStyle(0, 0xcc0000);
            _modePointer.graphics.beginFill(0xcc0000);
            _modePointer.graphics.moveTo(-40, -2);
            _modePointer.graphics.lineTo(-40, 2);
            _modePointer.graphics.lineTo(40, 2);
            _modePointer.graphics.lineTo(40, -2);
            _modePointer.graphics.endFill();
            _modePointer.x = drawButton.x;
            _modePointer.y = drawButton.y + 15;
            addChild(_modePointer);
            
            var showOutPutButton:Sprite = makeBtn(80, 20, "出力");
            showOutPutButton.x = 340;
            showOutPutButton.y = 420;
            addChild(showOutPutButton);
            showOutPutButton.addEventListener(MouseEvent.CLICK, showOutPutButtonClickHandler);
            
            //出力用ウィンドウの生成。
            _outPutWindow = new Sprite();
            var w:Number = 400;
            var h:Number = 400;
            _outPutWindow.graphics.lineStyle(1, 0x333333, 0.5);
            _outPutWindow.graphics.beginFill(0xffffff, 0.5);
            _outPutWindow.graphics.moveTo(0, 0);
            _outPutWindow.graphics.lineTo(0, h);
            _outPutWindow.graphics.lineTo(w, h);
            _outPutWindow.graphics.lineTo(w, 0);
            _outPutWindow.graphics.endFill();
            var btnClose:Sprite = this.makeBtn(80, 20, "閉じる");
            _outPutWindow.addChild(btnClose);
            btnClose.x = w / 2;
            btnClose.y = h - 30;
            btnClose.addEventListener(MouseEvent.CLICK, btnCloseClickHandler);
            _outPutWindow.visible = false;
            this._outPutTextField = new TextField();
            _outPutTextField.autoSize = TextFieldAutoSize.LEFT;
            _outPutWindow.addChild(_outPutTextField);
            addChild(_outPutWindow);
        }
        
        private function btnCloseClickHandler(event:MouseEvent):void
        {
            _outPutWindow.visible = false;
            _outPutWindow.removeChild(_outPutBitMap);
        }

        
        /**
        *    出力ボタンをクリックした際のファンクション。
        **/
        private function showOutPutButtonClickHandler(event:MouseEvent):void
        {
            _outPutTextField.text = "";
            //出力用配列の生成。Gridの数だけ0を格納した配列を作成する。
            var outPutArray:Array = [];
            var i:int = 0;
            for(i; i < _horizonalGridNum; i++)
            {
                var array:Array = [];
                var j:int = 0;
                for(j; j < _verticalGridNum; j++)
                {
                    array.push(0);
                }
                outPutArray.push(array);
            }
            //全グリッドの走査。
            var targetArray:Array;
            for each(targetArray in _allGridArray)
            {
                var targetGrid:GridSprite;
                var arrayIndexNum:int = _allGridArray.indexOf(targetArray);
                for each(targetGrid in targetArray)
                {
                    if(targetGrid.type == "clicked")
                    {
                        var gridIndexNum:int = targetArray.indexOf(targetGrid);
                        outPutArray[arrayIndexNum][gridIndexNum] = 1;
                        //targetArray[indexNum] = 1;
                    }
                }
            }
            //全配列の再チェックしてトリミング。
            //Step1:上段から順に走査。何か表示が出た時点で処理をとめる。
            for (i = 0; i < outPutArray.length; i++)
            {
                targetArray = outPutArray[0];
                if(targetArray.indexOf(1) == -1)
                {
                    //1が含まれていない、つまり何も描画されていない。
                    outPutArray.splice(0, 1);
                }
                else
                {
                    break;
                }
            }
            //Step2:下段から順に走査。何か表示が出た時点で処理をとめる。
            for (i = outPutArray.length - 1; i >= 0; i--)
            {
                targetArray = outPutArray[i];
                if(targetArray.indexOf(1) == -1)
                {
                    //1が含まれていない、つまり何も描画されていない。
                    var indexNum:int = outPutArray.indexOf(targetArray);
                    outPutArray.splice(indexNum, 1);
                }
                else
                {
                    break;
                }
            }
            //Step3:左列から順に走査。何か表示が出た時点で処理をとめる。
            for (i = 0; i < outPutArray[0].length; i++)
            {
                var totalNum:int = 0;
                for each(targetArray in outPutArray)
                {
                    totalNum += targetArray[0];
                }
                if(totalNum != 0)
                {
                    break;
                }
                else
                {
                    //1が含まれていない、つまり何も描画されていない。
                    for each(targetArray in outPutArray)
                    {
                        targetArray.splice(0, 1);
                    }
                }
            }
            //Step4:右列から順に走査。何か表示が出た時点で処理をとめる。
            for (i = outPutArray[0].length - 1; i >= 0; i--)
            {
                totalNum = 0;
                for each(targetArray in outPutArray)
                {
                    totalNum += targetArray[i];
                }
                if(totalNum != 0)
                {
                    break;
                }
                else
                {
                    //1が含まれていない、つまり何も描画されていない。
                    for each(targetArray in outPutArray)
                    {
                        targetArray.splice(i, 1);
                    }
                }
            }
            //トリミング終了後の配列をテキストフィールドに出力。
            for each(targetArray in outPutArray)
            {
                _outPutTextField.appendText("[" + String(targetArray) + "]," + "\n");
            }
            _outPutWindow.visible = true;
            _outPutBitMap = setBmpData(outPutArray, 2, 2);
            _outPutWindow.addChild(_outPutBitMap);
            _outPutBitMap.x = 300;
        }
        
        /**
        *    モード選択ボタンをクリックした際のファンクション。
        **/
        private function modeButtonClickHandler(event:MouseEvent):void
        {
            var targetButton:Sprite = event.currentTarget as Sprite;
            var selectedMode:String = targetButton.name;
            this._mode = selectedMode;
            if(this._mode == DotEditor.MODE_DRAW || this._mode == DotEditor.MODE_ERASE)
                this._modePointer.x = targetButton.x;
            if(this._mode == DotEditor.MODE_RESET)
            {
                var targetArray:Array;
                for each(targetArray in _allGridArray)
                {
                    var targetGrid:GridSprite;
                    for each(targetGrid in targetArray)
                    {
                        targetGrid.changeColor(DotEditor.MODE_ERASE);
                    }
                }
                this._mode = DotEditor.MODE_DRAW;
            }
        }

        /**
        *    ボタンを生成するファンクション。
        **/
        private function makeBtn(widthNum:Number, heightNum:Number, btnLabel:String = "btn"):Sprite
        {
            var btnSprite:Sprite = new Sprite();
            btnSprite.graphics.lineStyle(1, 0x999999);
            btnSprite.graphics.beginFill(0xcccccc);
            btnSprite.graphics.moveTo(-widthNum / 2, -heightNum / 2);
            btnSprite.graphics.lineTo(-widthNum / 2, heightNum / 2);
            btnSprite.graphics.lineTo(widthNum / 2, heightNum / 2);
            btnSprite.graphics.lineTo(widthNum / 2, -heightNum / 2);
            btnSprite.graphics.endFill();
            var labelField:TextField = new TextField();
            labelField.text = btnLabel;
            labelField.autoSize = TextFieldAutoSize.CENTER;
            labelField.x = -labelField.width / 2;
            labelField.y = -labelField.height / 2;
            labelField.selectable = false;
            labelField.mouseEnabled = false;
            btnSprite.addChild(labelField);
            this.buttonMode = true;
            return btnSprite;
        }

        /**
        *    グリッド上でマウスダウンした際のファンクション。
        **/
        private function gridMouseDownHandler(event:MouseEvent):void
        {
            _mouseDownFlg = true;
            var targetGrid:GridSprite = event.currentTarget as GridSprite;
            targetGrid.changeColor(this._mode);
        }
        
        /**
        *    グリッド上でマウスアップした際のファンクション。
        **/
        private function gridMouseUpHandler(event:MouseEvent):void
        {
            _mouseDownFlg = false;
        }
        
        /**
        *    グリッドにロールオーバーした際のファンクション。
        **/
        private function gridRollOverFunction(event:MouseEvent):void
        {
            if(!_mouseDownFlg)
                return;
            var targetGrid:GridSprite = event.currentTarget as GridSprite;
            targetGrid.changeColor(this._mode);
        }
        
        /**
        *    出力結果をビットマップに反映させるファンクション。
        **/
        private function setBmpData(outPutArray:Array, pixWidth:uint = 1, pixHeight:uint = 1):Bitmap
        {
            var horizonalPixelNum:uint = outPutArray[0].length;
            var verticalPixelNum:uint = outPutArray.length;
            var bmd:BitmapData = new BitmapData(pixWidth * horizonalPixelNum, pixHeight * verticalPixelNum, true, 0x00ffffff);
            var colorBmd:BitmapData = new BitmapData(pixWidth, pixHeight, true, 0xff000000);
            var emptyBmd:BitmapData = new BitmapData(pixWidth, pixHeight, true, 0x00ffffff);
            var bmp:Bitmap = new Bitmap(bmd);
            var i:int = 0;
            for(i; i < outPutArray.length; i++)
            {
                var targetArray:Array = outPutArray[i];
                var j:int = 0;
                for(j; j < targetArray.length; j++)
                {
                    //0か1かの結果を取得する。
                    var colorNum:int = targetArray[j];
                    var rect:Rectangle = new Rectangle(j * pixWidth, i * pixHeight, pixWidth, pixHeight);
                    var bytes:ByteArray;
                    if(colorNum == 1)
                        bytes = colorBmd.getPixels(new Rectangle(0, 0, pixWidth, pixHeight));
                    else if(colorNum == 0)
                        bytes = emptyBmd.getPixels(new Rectangle(0, 0, pixWidth, pixHeight));
                    bytes.position = 0;
                    bmd.setPixels(rect, bytes);
                }
            }
            return bmp;
        }

    }
}
import flash.display.Sprite;

class GridSprite extends Sprite
{
    private const TYPE_DEFAULT:String = "default";
    private const TYPE_CLICKED:String = "clicked";
    private var _type:String = TYPE_DEFAULT;
    private var _widthNum:Number;
    private var _heightNum:Number;
    
    /**
    *    コンストラクタ。
    **/
    public function GridSprite(widthNum:Number, heightNum:Number)
    {
        init(widthNum, heightNum);
    }
    
    private function init(widthNum:Number, heightNum:Number):void
    {
        buttonMode = true;
        _widthNum = widthNum;
        _heightNum = heightNum;
        drawGrid(widthNum, heightNum);
    }
    
    /**
    *    色を変化させるファンクション。
    **/
    public function changeColor(type:String):void
    {
        if(this._type == type)
            return;
        switch(type)
        {
            case DotEditor.MODE_DRAW:
                this._type = TYPE_CLICKED;
                break;
            case DotEditor.MODE_ERASE:
                this._type = TYPE_DEFAULT;
                break;
        }
        //this._type = type;
        drawGrid(this._widthNum, this._heightNum);
    }
    
    private function drawGrid(width:Number, height:Number):void
    {
        var color:uint;
        switch(this._type)
        {
            case TYPE_DEFAULT:
                color = 0xcccccc;
                break;
            case TYPE_CLICKED:
                color = 0x333333;
                break;
        }
        graphics.clear();
        graphics.lineStyle(1 , 0xaaaaaa);
        graphics.beginFill(color);
        graphics.moveTo(0 , 0);
        graphics.lineTo(0 , height);
        graphics.lineTo(width , height);
        graphics.lineTo(width , 0);
        graphics.endFill();
    }
    
    /**
    *    _typeを取得するゲッター。
    **/
    public function get type():String
    {
        return this._type;
    }


}