MoistMoss.as (メインクラス)
package {
    import flash.display.Sprite;
    import flash.events.Event;
    
    [SWF(width="550",height="400",backgroundColor="0x0",frameRate="24")]

    public class MoistMoss extends Sprite{
        
        private var IMAX:int = 40;
        private var target:Sprite;
        
        public function MoistMoss(){
            target = new Sprite();
            
            for (var i:int=0; i<=IMAX; i++){
                var x:Number = stage.stageWidth*i/IMAX;
                var y:Number = stage.stageHeight;
                var r:uint = 0;
                var g:uint = 255*(1 - 0.75*i/IMAX);
                var b:uint = 255*(1 - 0.75*i/IMAX);
                var color:uint = r<<16 | g<<8 | b;
                addChild(new Chaser(x,y,target,color));
            }
            addEventListener(Event.ENTER_FRAME,move);
        }
        
        private function move(e:Event):void{
            const DUMP:Number = 5;
            var dx:Number = mouseX - target.x;
            var dy:Number = mouseY - target.y;
            target.x += dx/DUMP;
            target.y += dy/DUMP;
        }
    }
}
Chaser.as (線一本の動き)
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;

    public class Chaser extends Sprite{
        private const TOTAL:uint = 10;
        private const LENGTH:Number = 50;
        private const LINE_THICKNESS:Number = 1; 
        
        private var segments:Array;
        private var color:uint;
        private var spr:Sprite;
        
        public function Chaser(rootX:Number,rootY:Number,spr:Sprite,col:uint){
            this.spr = spr;
            this.color = col;
            
            segments = new Array();
            for(var i:uint = 0; i<TOTAL; i++){
                var segment:Segment = new Segment(LENGTH);
                segments.push(segment);
            }
            segment.x = rootX;
            segment.y = rootY;
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(event:Event):void{
            var target:Point = reach(segments[0],spr.x,spr.y);
            graphics.clear();
            graphics.lineStyle(LINE_THICKNESS,color,0.2);
            graphics.moveTo(segments[0].getPin().x,segments[0].getPin().y);
            
            for(var i:uint = 1; i < TOTAL; i++){
                var segment:Segment = segments[i];
                target = reach(segment, target.x, target.y);
                var xc:Number = (segment.getPin().x + segment.x)/2;
                var yc:Number = (segment.getPin().y + segment.y)/2;
                graphics.curveTo(segment.getPin().x,segment.getPin().y,xc,yc);
                
                //for the last
                if (i == TOTAL-1){
                    graphics.lineTo(segment.x,segment.y);
                }
            }

            for(i = TOTAL-1; i>0; i--){
                position(segments[i-1], segments[i]);
            }
        }
        
        private function reach(segment:Segment, xpos:Number, ypos:Number):Point{
            var dx:Number = xpos - segment.x;
            var dy:Number = ypos - segment.y;
            var angle:Number = Math.atan2(dy, dx);
            segment.rotation = angle * 180 / Math.PI;
            
            var w:Number = segment.getPin().x - segment.x;
            var h:Number = segment.getPin().y - segment.y;
            var tx:Number = xpos - w;
            var ty:Number = ypos - h;
            return new Point(tx, ty);
        }
        
        private function position(segChild:Segment, segParent:Segment):void{
            segChild.x = segParent.getPin().x;
            segChild.y = segParent.getPin().y;
        }
    }
}
Segment.as (関節)
package{
    import flash.display.Sprite;
    import flash.geom.Point;

    public class Segment extends Sprite{
        private var segmentWidth:Number;
        
        public var vx:Number = 0;
        public var vy:Number = 0;
        
        public function Segment(segmentWidth:Number){
            this.segmentWidth = segmentWidth;
        }
        
        public function getPin():Point{
            var angle:Number = rotation * Math.PI / 180;
            var xPos:Number = x + Math.cos(angle) * segmentWidth;
            var yPos:Number = y + Math.sin(angle) * segmentWidth;
            return new Point(xPos, yPos);
        }
    }
}
Powered by blog Boreal Kiss 2008.