写経続き

AS3 でどこからでも log(); - PBD - subtech
http://subtech.g.hatena.ne.jp/secondlife/20070219/1171872801

    • -

xs = []; しないで xs.push() してて実行時エラーになっていた。実行時エラーのエラーメッセージとかはどこに出るんだ?

    • -

log.as便利。

    • -

はてなダイアリーFlash を埋め込むガジェット - てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20070829/embed_flash_on_hatena_diary

おー、これを使えば貼れるのか。

    • -

大きなλが好きな人は下へ
http://www.nishiohirokazu.org/files/UneuneLambda.swf
λ....

    • -

すばらしい。最初から最後までnitoyonさんのおかげ。nitoyon++;

    • -

ソース。

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;

    [SWF(backgroundColor="#eeffee")]
    public class UneuneLambda extends Sprite {
        private var start:Point;
        private var controls:Array;
        private var anchors:Array;

        private var heads:Array;
        private var pres:Array;
        private var posts:Array;
        private var ndirs:Array;
        private var phases:Array;

        private var cur:Point;
        private var prev:Point;
        private var count:int;
        private const WAIT:int = 20;
        private const DISTANCE:int = 25;
        private const RANDOM:Number = 3;
        
        public function UneuneLambda(){
            stage.addEventListener("mouseDown", mouseDownHandler);
            addEventListener("enterFrame", enterFrameHandler);
            pres = [];
            posts = [];
            heads = [];
            ndirs = [];
            phases = [];
        }
        
        private function mouseDownHandler(event:MouseEvent):void{
            stage.addEventListener("mouseMove", mouseMoveHandler);
            stage.addEventListener("mouseUp", mouseUpHandler);
            count = 0;
            start = new Point(event.stageX, event.stageY);
            cur = start.clone();
            prev = start.clone();
            controls = [null];
            anchors = [start];
        }
        
        private function mouseMoveHandler(event:MouseEvent):void{
            cur.x = event.stageX; cur.y = event.stageY;
            count++;
            if(count == WAIT || count < WAIT && Point.distance(prev, cur) > DISTANCE){
                prev = cur.clone();
                controls.push(cur.clone());
                count = WAIT;
            }else if(count == WAIT * 2 || Point.distance(prev, cur) > DISTANCE){
                prev = cur.clone();
                anchors.push(cur.clone());
                
                var pt:Point = Point(anchors[anchors.length - 2]);
                var c:Point = Point(controls[anchors.length - 1]);
                var diff:Point = pt.subtract(c);
                var sum:Point = pt.add(c);
                c.x = sum.x / 2 - diff.y * 2;
                c.y = sum.y / 2 + diff.x * 2;
                count = 0;
            }

        }
        
        private function mouseUpHandler(event:MouseEvent):void{
            stage.removeEventListener("mouseUp", mouseUpHandler);
            stage.removeEventListener("mouseMove", mouseMoveHandler);
            start = null;
            cur = null;
            for(var i:int = 1; i < anchors.length; i++){
                heads.push(controls[i]);
                var v1:Point = anchors[i - 1];
                var v2:Point = anchors[i].clone();
                pres.push(v1);
                posts.push(v2);
                var ndir:Point = v1.subtract(v2);
                ndir.normalize(1);
                ndirs.push(ndir);
                phases.push("heads");
            }
        }
        
        private function enterFrameHandler(event:Event):void{
            graphics.clear();
            if(start){
                graphics.lineStyle();
                graphics.moveTo(anchors[0].x, anchors[0].y);
                graphics.lineStyle(1, 0);
                for(var i:int = 1; i < anchors.length; i++){
                    graphics.curveTo(
                        controls[i].x + Math.random() * RANDOM - RANDOM / 2,
                        controls[i].y + Math.random() * RANDOM - RANDOM / 2,
                        anchors[i].x + Math.random() * RANDOM - RANDOM / 2,
                        anchors[i].y + Math.random() * RANDOM - RANDOM / 2);
                }
                graphics.lineTo(cur.x, cur.y);
            }

            // render lambdas
            for(i = 0; i < heads.length; i++){
                graphics.lineStyle();
                graphics.moveTo(pres[i].x, pres[i].y);
                graphics.lineStyle(1, 0);
                graphics.curveTo(
                    heads[i].x + Math.random() * RANDOM - RANDOM / 2,
                    heads[i].y + Math.random() * RANDOM - RANDOM / 2,
                    posts[i].x,
                    posts[i].y);
            }
            
            // move lambdas
            var speed:Number;
            for(i = 0; i < heads.length; i++){
                if(phases[i] == "heads"){
                    heads[i].x += ndirs[i].x * 2;
                    heads[i].y += ndirs[i].y * 2;
                    
                    var v:Point = heads[i].subtract(pres[i]);
                    var dp:Number = v.x * ndirs[i].x + v.y * ndirs[i].y;
                    if(dp > 0){
                        phases[i] = "posts";
                    }
                }else if(phases[i] == "posts"){
                    speed = Point.distance(pres[i], posts[i]) / 5 + 1;
                    posts[i].x += ndirs[i].x * speed;
                    posts[i].y += ndirs[i].y * speed;

                    v = posts[i].subtract(pres[i]);
                    dp = v.x * ndirs[i].x + v.y * ndirs[i].y;
                    if(dp > 0){
                        phases[i] = "pres";
                    }
                }else if(phases[i] == "pres"){
                    speed = (DISTANCE - Point.distance(pres[i], posts[i])) / 5 + 1;
                    pres[i].x += ndirs[i].x * speed;
                    pres[i].y += ndirs[i].y * speed;
                    if(Point.distance(pres[i], posts[i]) > DISTANCE){
                        phases[i] = "heads";
                    }
                }
            }
        }
    }
}