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

ローレゾなドット絵の拡大

-------------------------------------------------
ローレゾなドット絵の拡大
マウスホイール回転で拡大縮小が可能です。
ニアレストネイバーで拡大するとくっきりしますがたゆみます。
バイリニアで拡大するとぼやけますがスムーズに拡大します。
ニアレストネイバーで整数倍拡大してからバイリニアで拡大すると
くっきり感を得つつスムーズに拡大します。
-------------------------------------------------
Get Adobe Flash player
by Hakuhin 29 Jul 2010
/**
 * Copyright Hakuhin ( http://wonderfl.net/user/Hakuhin )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/sFXJ
 */

// -------------------------------------------------
//
// ローレゾなドット絵の拡大
//
// マウスホイール回転で拡大縮小が可能です。
//
// ニアレストネイバーで拡大するとくっきりしますがたゆみます。
// バイリニアで拡大するとぼやけますがスムーズに拡大します。
// 
// ニアレストネイバーで整数倍拡大してからバイリニアで拡大すると
// くっきり感を得つつスムーズに拡大します。
// 
// -------------------------------------------------
package {
    import flash.events.*;
    import flash.display.*;
    import flash.net.*;
    import flash.text.*;
    import flash.utils.*;
    import flash.system.*;
    import flash.geom.*;
    import flash.filters.*;
    import flash.ui.*;
    import flash.media.*;

    public class Main extends Sprite {
        public function Main() {

        
// -------------------------------------------------
// コンストラクタ
// -------------------------------------------------

// フレームレート
stage.frameRate = 60;

// 100%表示
stage.scaleMode = StageScaleMode.NO_SCALE;

// 左上
stage.align = StageAlign.TOP_LEFT;
stage.align = "TL";

// スプライトを作成
var sprite:Sprite = new Sprite();
var g:Graphics = sprite.graphics;
addChild(sprite);

// 初期化へ
init();


// -------------------------------------------------
// 初期化
// -------------------------------------------------
function init():void{

    // 画像のURL
    var url:String = "http://assets.wonderfl.net/images/related_images/0/0e/0ee3/0ee37c49d725908c5ff6b65acab0b85277048041";

    // ステージサイズ
    var w:uint;
    var h:uint;
    
    var bmp_src:BitmapData = null;
    
    // ローダー作成
    var loader_obj : Loader = new Loader();
    var info : LoaderInfo = loader_obj.contentLoaderInfo;
    
    // 読み込み完了
    info.addEventListener (Event.INIT,LoaderInfoInitFunc);
    function LoaderInfoInitFunc (event : Event):void {
        
        // メモリからインスタンス化
        var loader_memory : Loader = new Loader();
        loader_memory.contentLoaderInfo.addEventListener (Event.COMPLETE,LoaderInfoCompleteFunc);
        function LoaderInfoCompleteFunc (event : Event):void {
            
            var sprite:Sprite = new Sprite();
            stage.addChild(sprite);

            // キャプチャ
            bmp_src = new BitmapData(loader_memory.width,loader_memory.height,true,0);
            sprite.addChild(loader_memory);
            bmp_src.draw(sprite);
            sprite.removeChild(loader_memory);
            stage.removeChild(sprite);
  
            // リサイズ
            ResizeFunc(null);
        }
        
        // 読み込み開始
        loader_memory.loadBytes(loader_obj.contentLoaderInfo.bytes);
    }


    // 読み込み開始
    load(url);

    // リザルト作成
    var result : Sprite = new Sprite();
    addChild(result);
    result.x = 0;
    
    // 拡大用ラジオボタン
    var radio_scale1:RadioButton = new RadioButton(stage);
    result.addChild(radio_scale1);
    radio_scale1.setLabel("補正なし");
    radio_scale1.x = 0;
    radio_scale1.y = 4;
    radio_scale1.setSize(80,18);
    radio_scale1.onClick(function(obj:RadioButton):void{bmp_scale = 1.0;});

    var radio_scale2:RadioButton = new RadioButton(stage);
    result.addChild(radio_scale2);
    radio_scale2.setLabel("2倍補正");
    radio_scale2.x = 0;
    radio_scale2.y = 22;
    radio_scale2.setSize(80,18);
    radio_scale2.onClick(function(obj:RadioButton):void{bmp_scale = 2.0;});

    var radio_scale3:RadioButton = new RadioButton(stage);
    result.addChild(radio_scale3);
    radio_scale3.setLabel("3倍補正");
    radio_scale3.x = 0;
    radio_scale3.y = 40;
    radio_scale3.setSize(80,18);
    radio_scale3.onClick(function(obj:RadioButton):void{bmp_scale = 3.0;});

    var radio_scale4:RadioButton = new RadioButton(stage);
    result.addChild(radio_scale4);
    radio_scale4.setLabel("4倍補正");
    radio_scale4.x = 0;
    radio_scale4.y = 58;
    radio_scale4.setSize(80,18);
    radio_scale4.onClick(function(obj:RadioButton):void{bmp_scale = 4.0;});

    var radio_scale5:RadioButton = new RadioButton(stage);
    result.addChild(radio_scale5);
    radio_scale5.setLabel("5倍補正");
    radio_scale5.x = 0;
    radio_scale5.y = 76;
    radio_scale5.setSize(80,18);
    radio_scale5.onClick(function(obj:RadioButton):void{bmp_scale = 5.0;});

    // ラジオボタンを関連付け
    radio_scale1.attachGroup(radio_scale2);
    radio_scale1.attachGroup(radio_scale3);
    radio_scale1.attachGroup(radio_scale4);
    radio_scale1.attachGroup(radio_scale5);
    radio_scale5.select();


    // 画質用ラジオボタン
    var radio_low:RadioButton = new RadioButton(stage);
    result.addChild(radio_low);
    radio_low.setLabel("画質:low");
    radio_low.x = 0;
    radio_low.y = 4;
    radio_low.setSize(100,18);
    radio_low.onClick(function(obj:RadioButton):void{stage.quality = StageQuality.LOW;});

    var radio_high:RadioButton = new RadioButton(stage);
    result.addChild(radio_high);
    radio_high.setLabel("画質:high");
    radio_high.x = 0;
    radio_high.y = 22;
    radio_high.setSize(100,18);
    radio_high.onClick(function(obj:RadioButton):void{stage.quality = StageQuality.HIGH;});

    // ラジオボタンを関連付け
    radio_low.attachGroup(radio_high);
    radio_high.select();


    // テキストフィールド作成
    var ft_result:TextField = new TextField();
    ft_result.x = 10;
    ft_result.y = 80;
    ft_result.width = 150;
    ft_result.height = 20;
    ft_result.selectable = false;

    // 書式
    var format_result:TextFormat = new TextFormat();
    format_result.font = "MS ゴシック";    // フォント名
    ft_result.defaultTextFormat = format_result;

    // テキスト表示
    result.addChild(ft_result);

    // 読み込み状況
    addEventListener (Event.ENTER_FRAME,EnterFrameFunc);
    function EnterFrameFunc (event : Event) :void{
        ft_result.text = "読込:" + info.bytesLoaded + " / 全体:" + info.bytesTotal;
    }

    // テキストフィールド作成
    var text:TextField = new TextField();
    text.x = 10;
    text.y = 100;
    text.height = 20;
    text.type = TextFieldType.INPUT;
    text.border = true;

    // 書式
    var format:TextFormat = new TextFormat();
    format.font = "MS ゴシック";    // フォント名
    text.defaultTextFormat = format;

    // テキスト表示
    text.text = url;
    result.addChild(text);
    
    // ボタン作成
    var button:Button = new Button(stage);
    button.y = 100;
    button.setSize(60,20);
    button.setLabel("開く");
    result.addChild(button);

    // ボタンが押された
    button.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
        load(text.text);
    });
    
    function load(url:String):void{

        // 読み込み
        loader_obj.load(new URLRequest(url));
    }
    
    // リサイズ時にフィット
    stage.addEventListener(Event.RESIZE,ResizeFunc);
    function ResizeFunc(e:Event):void{
        w = stage.stageWidth;
        h = stage.stageHeight;

        result.y = h - 130;
    
        // テキストフィールド位置
        text.width = w - 10 - 10 - button.width - 10;
    
        // ボタン位置
        button.x = w - button.width - 10;
        
        // ラジオボタン位置
        radio_scale1.x = w - 200;
        radio_scale2.x = w - 200;
        radio_scale3.x = w - 200;
        radio_scale4.x = w - 200;
        radio_scale5.x = w - 200;
        radio_low.x = w - 100;
        radio_high.x = w - 100;
    }
    ResizeFunc(null);
    
    
    var px:Number = 0;
    var py:Number = 0;
    var rot:Number = 0;
    var sx:Number = 0;
    var sy:Number = 0;
    var scale:Number = 5.0;
    var phase:Number = 0;
    var bmp_scale:Number;
    var m:Matrix;

    addEventListener(Event.ENTER_FRAME,function(e:Event):void{

        if(!bmp_src)    return;
        
        // 少し移動
        px += 0.05;
        py += 0.05;

        // 少し回転
//        rot += 0.05;

        // 拡大縮小
        phase += 3.0 * Math.PI / 180;
        sx = Math.cos(phase) * 0.015625 + 1.0;
        sy = Math.sin(phase) * 0.015625 + 1.0;
        
        sx *= scale;
        sy *= scale;

        var bmp_w:uint = Math.floor(bmp_scale * bmp_src.width);
        var bmp_h:uint = Math.floor(bmp_scale * bmp_src.height);
        
        var bmp_cpy:BitmapData = new BitmapData(bmp_w,bmp_h,true);
        bmp_cpy.draw(
                     bmp_src,
                     new Matrix(bmp_scale,0,0,bmp_scale,0,0),
                     new ColorTransform(1,1,1,1,0,0,0,0),
                     BlendMode.NORMAL,
                     new Rectangle(0,0,bmp_w,bmp_h),
                     false
        );
        
        m = new Matrix();
        m.identity();
        m.scale(1.0/bmp_scale,1.0/bmp_scale);
        m.translate(px,py);
        m.translate(-w/2.0,-(h-130)/2.0);
        m.scale(sx , sy);
        m.rotate(rot * Math.PI / 180);
        m.translate( w/2.0, (h-130)/2.0);
    
        g.clear();
        g.beginBitmapFill(bmp_cpy,m,true,true);
        g.drawRect(0,0,w,h-130);
        g.endFill();
    });


    // テキスト表示
    var tf : TextField = new TextField();
    tf.x = 5;
    tf.y = 5;
    tf.width = 150;
    tf.height = 34;
    tf.border = true;
    tf.background = true;
    tf.alpha = 0.9;
    
    // 書式
    format = new TextFormat();
    format.font = "MS ゴシック";
    tf.defaultTextFormat = format;

    addChild(tf);
    addEventListener(Event.ENTER_FRAME,function(e:Event):void{
        var str:String = "";
        var d:Number;
        str += "scaleX : " + Math.floor(sx * 100000) / 100000 + "\n";
        str += "scaleX : " + Math.floor(sy * 100000) / 100000 + "\n";
        tf.text = str;
    });

    // マウス操作
    addEventListener(MouseEvent.MOUSE_WHEEL, function (event:MouseEvent):void{
        scale += event.delta * 0.1;
        if(scale < 1.0)    scale = 1.0;
        if(scale > 5.0)    scale = 5.0;
    });


}




        }
    }
}




import flash.events.*;
import flash.display.*;
import flash.text.*;
import flash.geom.*;

// -------------------------------------------------
// ボタン
// -------------------------------------------------
internal class Button extends Sprite {

    private var _width:Number;
    private var _height:Number;
    
    private var _text:TextField;
    private var _background:Sprite;
    

    public function Button(stage:Stage) {
        var slider:Button = this;

        // 背景用スプライト作成
        _background = new Sprite();
        addChild(_background);

        // テキストフィールド
        _text = new TextField();
        addChild(_text);
    
        _text.x = 0;
        _text.y = 0;
        _text.selectable = false;

        // 書式
        var format:TextFormat = new TextFormat();
        format.align = TextFormatAlign.CENTER;    // 整列
        format.font = "MS ゴシック";    // フォント名
        format.size = 14;                // 文字のポイントサイズ
        format.color = 0x202020;        // 文字の色
        _text.defaultTextFormat = format;
    
        // マウスオーバーで少し明るく
        addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent):void{
            var color : ColorTransform = new ColorTransform(1,1,1,1,8,8,8,0);
            transform.colorTransform = color;
        });

        // マウスアウトで元に戻す
        addEventListener(MouseEvent.MOUSE_OUT,function(e:MouseEvent):void{
            var color : ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0);
            transform.colorTransform = color;                                                           
        });

        // デフォルト値
        setSize(100,100);
        update();
    }
    // リサイズ
    public function setSize(w:Number,h:Number):void{
        // 背景リサイズ
        _width = w;
        _height = h;
        update();
    }
    // ラベルセット
    public function setLabel(str:String):void{
        _text.text = str;
        update();
    }
    // 描画更新
    private function update():void{
        // 背景描画
        var g:Graphics = _background.graphics;
        
        // 角丸矩形描画
        g.clear();
        g.lineStyle ( 0 , 0x808080 , 1.0,false,LineScaleMode.NONE,CapsStyle.ROUND,JointStyle.ROUND);
        g.beginFill ( 0xF0F0F0 , 1.0 );
        g.drawRoundRect ( 0 , 0 , _width , _height , 5 , 5 );
        g.endFill();
        
        // テキスト位置修正
        _text.width  = _width;
        _text.height = _height;
    }
}



import flash.events.*;
import flash.display.*;
import flash.text.*;
import flash.geom.*;

// -------------------------------------------------
// ラジオボタン
// -------------------------------------------------
internal class RadioButton extends Sprite {

    private var _width:Number;
    private var _height:Number;
    
    private var _text:TextField;
    private var _background:Sprite;
    private var _button:Sprite;
    private var _check:Sprite;
    
    private var _pref:RadioButton;
    private var _post:RadioButton;
    
    private var _selected:Boolean;
    private var _onClick:Function;

    public function RadioButton(stage:Stage) {
        var slider:RadioButton = this;
        
        _onClick = null;
        _selected = false;
        
        // リングリスト作成
        _pref = this;
        _post = this;

        // 背景用スプライト作成
        _background = new Sprite();
        addChild(_background);

        // ボタン用スプライト作成
        _button = new Sprite();
        addChild(_button);

        // チェック用スプライト作成
        _check = new Sprite();
        addChild(_check);

        // テキストフィールド
        _text = new TextField();
        addChild(_text);
    
        _text.x = 20;
        _text.y = 0;
        _text.selectable = false;

        // 書式
        var format:TextFormat = new TextFormat();
        format.align = TextFormatAlign.LEFT;    // 整列
        format.font = "MS ゴシック";            // フォント名
        format.size = 14;                        // 文字のポイントサイズ
        format.color = 0x202020;                // 文字の色
        _text.defaultTextFormat = format;
    
        // マウスオーバーで少し明るく
        addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent):void{
            var color : ColorTransform = new ColorTransform(1,1,1,1,8,8,8,0);
            transform.colorTransform = color;
        });

        // マウスアウトで元に戻す
        addEventListener(MouseEvent.MOUSE_OUT,function(e:MouseEvent):void{
            var color : ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0);
            transform.colorTransform = color;                                                           
        });

        // クリック
        addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
            select();                                               
        });

        // デフォルト値
        setSize(100,100);
        update();
    }
    // リサイズ
    public function setSize(w:Number,h:Number):void{
        // 背景リサイズ
        _width = w;
        _height = h;
        update();
    }
    // ラベルセット
    public function setLabel(str:String):void{
        _text.text = str;
        update();
    }
    // 描画更新
    private function update():void{
        // 背景描画
        var g:Graphics;
        var height_half:Number = _height / 2;
        var r:Number;

        
        // 背景描画
        g = _background.graphics;
        g.clear();
        g.beginFill ( 0xFFFFFF , 0.0 );
        g.drawRect ( 0 , 0 , _width , _height );
        g.endFill();

        
        // ボタン描画
        g = _button.graphics;
        g.clear();
        g.lineStyle ( 0 , 0x808080 , 1.0,false,LineScaleMode.NONE,CapsStyle.ROUND,JointStyle.ROUND);
        g.beginFill ( 0xF0F0F0 , 1.0 );
        r = height_half - 4;
        if(r < 4) r = 4;
        g.drawCircle ( height_half , height_half , r );
        g.endFill();

        // 背景描画
        g = _check.graphics;
        g.clear();
        g.lineStyle ( 0 , 0x404040 , 1.0,false,LineScaleMode.NONE,CapsStyle.ROUND,JointStyle.ROUND);
        g.beginFill ( 0x606060 , 1.0 );
        r = height_half - 8;
        if(r < 2) r = 2;
        g.drawCircle ( height_half , height_half , r );
        g.endFill();

        // テキスト位置修正
        _text.x  = _height;
        _text.width  = _width;
        _text.height = _height;

        if(_selected)    _check.visible = true;
        else            _check.visible = false;
    }
    
    // グループにセット
    public function attachGroup(button:RadioButton):void{
        button.removeGroup();

        var pref:RadioButton = this;
        var post:RadioButton = _post;

        pref._post = button;
        post._pref = button;
        button._pref = pref;
        button._post = post;
    }

    // グループから外す
    public function removeGroup():void{
        var pref:RadioButton = _pref;
        var post:RadioButton = _post;
        pref._post = post;
        post._pref = pref;
        _pref = this;
        _post = this;
    }
    
    // 選択
    public function select():void{
        // すべてのチェックを外す
        var list:RadioButton = this._post;
        while(true){
            if(list == this)    break;

            list._selected = false;
            list.update();
            list = list._post;
        }
        // チェック
        list._selected = true;
        list.update();
        
        // コールバック関数呼び出し
        if(_onClick != null){
            _onClick(this);
        }
    }

    // イベント登録
    public function onClick(func:Function):void{
        _onClick = func;
    }
}


// -------------------------------------------------
// 外部画像をサムネイルとしてキャプチャ
// -------------------------------------------------
import flash.net.*;
import flash.events.*;
import flash.display.*;
import flash.geom.*;
function ThumbnailCapture(url:String,time:uint,stage:Stage):void{

    // キャプチャタイミング
    Wonderfl.capture_delay( time );

    // スプライト作成
    var sprite : Sprite = new Sprite();

    // ステージ最前面に配置
    stage.addChildAt(sprite,stage.numChildren);
    
    // ローダー
    var loader_obj : Loader = new Loader();
    loader_obj.contentLoaderInfo.addEventListener (Event.INIT,function(e:Event):void{

        // メモリからインスタンス化
        var loader_memory : Loader = new Loader();
        loader_memory.contentLoaderInfo.addEventListener (Event.INIT,function(e:Event):void{

            // キャプチャ
            var bmp : BitmapData = new BitmapData(loader_memory.width,loader_memory.height,true,0);
            sprite.addChild(loader_memory);
            bmp.draw(sprite);
            sprite.removeChild(loader_memory);
            loader_memory.unload();
            loader_obj.unload();
            loader_memory = null;
            loader_obj = null;
            
            
            // 画像を配置
            var bmp_obj : Bitmap = new Bitmap(bmp);
            bmp_obj .width = stage.stageWidth;
            bmp_obj .height = stage.stageHeight;
            stage.addChild(bmp_obj );
            
        });
        
        // 読み込み開始
        loader_memory.loadBytes(loader_obj.contentLoaderInfo.bytes);
    });
    
    // 読み込み開始
    loader_obj.load(new URLRequest(url));
}