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 beinteractive 14 Mar 2011
/**
 * Copyright beinteractive ( http://wonderfl.net/user/beinteractive )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/shHm
 */

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Graphics;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    
    [SWF(width = 456, height = 456, frameRate = 30, bakcgroundColor = 0xffffff)]
    public class WonderflUmareruWanco extends Sprite
    {
        // ウンコSWF URL
        protected static const UNKO_URL:String = 'http://swf.wonderfl.net/static/assets/checkmate05/wancoProfessional.swf';
        
        // テクスチャサイズ
        protected static const TEXTURE_SIZE:uint = 70 * 2.0;
        // テクスチャ分割数
        protected static const TEXTURE_SPLIT:uint = 10;
        
        public function WonderflUmareruWanco()
        {
            // 設定
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.MEDIUM;
            
            // ウンコロード
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.load(new URLRequest(UNKO_URL));
        }
        
        /**
         * テクスチャ.
         */
        protected var texture:BitmapData;
        
        /**
         * キャンバス.
         */
        protected var canvas:Shape;
        
        /**
         * マウスが押されているか?
         */
        protected var isPressed:Boolean;
        
        /**
         * 生まれ具合.
         */
        protected var phase:Number;
        protected var vp:Number;
        
        /**
         * 頂点データ.
         */
        protected var vertices:Vector.<Number>;
        
        /**
         * 元の頂点データ.
         */
        protected var originalVertices:Vector.<Number>;
        
        /**
         * 頂点インデックス.
         */
        protected var indices:Vector.<int>;
        
        /**
         * テクスチャUV.
         */
        protected var uvData:Vector.<Number>;
        
        /**
         * ウンコロード完了.
         */
        protected function loadCompleteHandler(e:Event):void
        {
            // 後始末
            var loaderInfo:LoaderInfo = e.target as LoaderInfo;
            loaderInfo.removeEventListener(Event.COMPLETE, loadCompleteHandler);
            
            // ウンコクラス取り出し
            var unkoClass:Class = loaderInfo.applicationDomain.getDefinition('WakeMotion') as Class;
            
            // テクスチャ生成
            texture = makeTexture(new unkoClass(), 35, 55, TEXTURE_SIZE, 2.0);
            
            // 頂点データなど
            originalVertices = makeVertices(TEXTURE_SIZE, TEXTURE_SPLIT);
            vertices = makeVertices(TEXTURE_SIZE, TEXTURE_SPLIT);
            indices = makeIndices(TEXTURE_SPLIT);
            uvData = makeUvData(TEXTURE_SPLIT);
            phase = 0.0;
            
            // ヒットエリア
            var s:Sprite = new Sprite();
            s.graphics.beginFill(0xffffff);
            s.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            s.graphics.endFill();
            
            // 指カーソル他ボタン設定
            s.buttonMode = true;
            s.useHandCursor = true;
            s.mouseChildren = false;
            addChild(s);
            
            // *
            var f:Sprite = new Sprite();
            f.x = mouseX;
            f.y = mouseY;
            f.mouseChildren = false;
            f.mouseEnabled = false;
            addChild(f);
            var field:TextField = new TextField();
            field.defaultTextFormat = new TextFormat('Arial', 72, 0x000000, true);
            field.autoSize = TextFieldAutoSize.LEFT;
            field.text = '*';
            field.selectable = false;
            field.x = field.textWidth / -2.0;
            // field.y = -field.textHeight;
            f.addChild(field);
            f.startDrag();
            
            // キャンバス
            canvas = new Shape();
            addChild(canvas);
            
            // マウスイベント
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
            
            // フレームイベント
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
        
        /**
         * <code>image</code> を元に生成したテクスチャ.
         * 
         * @param    image    元画像
         * @param    x    中心X
         * @param    y    中心Y
         * @param    size    画像サイズ
         * @return    生成されたテクスチャ
         */
        protected function makeTexture(image:DisplayObject, x:int, y:int, size:Number, scale:Number):BitmapData
        {
            var texture:BitmapData = new BitmapData(size, size, true, 0x00000000);
            var m:Matrix = new Matrix();
            
            m.translate(x, y);
            m.scale(scale, scale);
            
            texture.draw(image, m);
            
            return texture;
        }
        
        /**
         * <code>size</code> ピクセルの正方形を分割数 <code>split</code> で描画するための頂点データ.
         * 
         * @param    size    正方形のサイズ
         * @param    split    分割数
         * @return    頂点データ.
         */
        protected function makeVertices(size:Number, split:uint):Vector.<Number>
        {
            var seg:Number = size / Number(split);
            
            var v:Vector.<Number> = new Vector.<Number>((split + 1) * (split + 1) * 2);
            
            var i:uint;
            for (var x:uint = 0; x <= split; ++x) {
                for (var y:uint = 0; y <= split; ++y) {
                    i = (y * (split + 1) + x) * 2;
                    v[i + 0] = seg * x;
                    v[i + 1] = seg * y;
                }
            }
            
            return v;
        }
        
        /**
         * 分割数 <code>split</code> の四角形を描画するための頂点インデックスデータ.
         * 
         * @param    split 分割数
         * @return    頂点インデックスデータ
         */
        protected function makeIndices(split:uint):Vector.<int>
        {
            var v:Vector.<int> = new Vector.<int>(split * split * 2 * 3);
            
            var i:uint;
            for (var x:uint = 0; x < split; ++x) {
                i = (x * (6 * split));
                for (var y:uint = 0; y < split; ++y) {
                    v[i + y * 6 + 0] = (y + 0) * (split + 1) + (x + 0);
                    v[i + y * 6 + 1] = (y + 0) * (split + 1) + (x + 1);
                    v[i + y * 6 + 2] = (y + 1) * (split + 1) + (x + 0);
                    v[i + y * 6 + 3] = (y + 0) * (split + 1) + (x + 1);
                    v[i + y * 6 + 4] = (y + 1) * (split + 1) + (x + 0);
                    v[i + y * 6 + 5] = (y + 1) * (split + 1) + (x + 1);
                    
                }
            }
            
            return v;
        }
        
        /**
         * 分割数 <code>split</code> の四角形のテクスチャデータ.
         * 
         * @param    split    分割数
         * @return    テクスチャデータ
         */
        protected function makeUvData(split:uint):Vector.<Number>
        {
            var v:Vector.<Number> = new Vector.<Number>((split + 1) * (split + 1) * 2);
            
            var i:uint;
            for (var x:uint = 0; x <= split; ++x) {
                for (var y:uint = 0; y <= split; ++y) {
                    i = (y * (split + 1) + x) * 2;
                    v[i + 0] = Number(x) / Number(split);
                    v[i + 1] = Number(y) / Number(split);
                }
            }
            
            return v;
        }
        
        /**
         * マウス押し下げ.
         */
        protected function mouseDownHandler(e:MouseEvent):void
        {
            if (isPressed) {
                return;
            }
            isPressed = true;
            phase = 0.0;
            vp = 0.003;
        }
        
        /**
         * マウス押し上げ.
         */
        protected function mouseUpHandler(e:MouseEvent):void
        {
            isPressed = false;
        }
        
        /**
         * フレームイベント.
         */
        protected function enterFrameHandler(e:Event):void
        {
            // マウス押されてる?
            if (isPressed) {
                // 生まれる
                if (phase < 1.0) {
                    phase += vp;
                    vp *= 1.05;
                }
                else {
                    phase = 1.0;
                }
            }
            else {
                // 戻る
                if (phase > 0.0) {
                    phase -= 0.1;
                }
            }
            
            // 描画コンテキスト
            var g:Graphics = canvas.graphics;
            
            // クリア
            g.clear();
            
            // マウス位置
            var mx:Number = mouseX;
            var my:Number = mouseY;
            // テクスチャサイズ
            var size:Number = TEXTURE_SIZE;
            // テクスチャ分割数
            var split:uint = TEXTURE_SPLIT;
            
            // 頂点データを再計算
            for (var x:uint = 0; x <= split; ++x) {
                for (var y:uint = 0; y <= split; ++y) {
                    var i:uint = (y * (split + 1) + x) * 2;
                    // 元の頂点位置
                    var vx:Number = originalVertices[i + 0];
                    var vy:Number = originalVertices[i + 1];
                    // どのくらい出てるか的な係数
                    var py:Number = ((size * phase) + (vy - size)) / size + phase * 0.75;
                    if (py <= 0.0) { py = 0.0; }
                    if (py >= 1.0) { py = 1.0; }
                    // X の変動係数
                    var p:Number = py / 3.0 + (phase * phase);
                    if (p <= 0.0) { p = 0.0; }
//                    if (p >= 1.0) { p = 1.0; }
                    // フェーズに応じて変形
                    vx = (size / 2.0) + (vx - size / 2.0) * p;
                    vy = vy * py;
                    // マウス位置に移動
                    vx = vx + mx - size / 2.0 + 2;
                    vy = vy + my + 32;
                    // 描画用の頂点データに反映
                    vertices[i + 0] = vx;
                    vertices[i + 1] = vy;
                }
            }
            
            // 描画
            g.beginBitmapFill(texture);
            g.drawTriangles(vertices, indices, uvData);
            g.endFill();
        }
    }
}