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);
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.