写経続き
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"; } } } } } }