Seaweeds.as (メインクラス)
package {
import flash.display.Sprite;
[SWF(width='550',height='400',backgroundColor='0x0',frameRate='20')]
public class Seaweeds extends Sprite{
private const WIDTH:Number = stage.stageWidth;
private const HEIGHT:Number = stage.stageHeight;
private static const WEED_TOTAL:int = 50;
private static const JOINT_TOTAL:int = 5;
private static const JOINT_LENGTH:Number = 80;
public function Seaweeds(){
var stars:Stars = new Stars(WIDTH,HEIGHT);
addChild(stars);
var moon:SpinningMoon = new SpinningMoon(110,110,WIDTH,HEIGHT);
addChild(moon);
for (var i:int=0; i<WEED_TOTAL; i++){
var x:Number = WIDTH + (Math.random()-0.5)*20;
var y:Number = HEIGHT + (Math.random()-0.5)*20;
var obj:Tentacle = new Tentacle(x,y,JOINT_TOTAL,JOINT_LENGTH,WIDTH,HEIGHT);
addChild(obj);
}
}
}
}
Tentacle.as (触手)
package{
import flash.display.Sprite;
import flash.geom.ColorTransform;
import flash.events.Event;
public class Tentacle extends Sprite{
private static var stageWidth:Number;
private static var stageHeight:Number;
private static var jointTotal:int;
private static var jointLength:Number;
private var posAry:Array;
private var colR:int;
private var colB:int;
private var colG:int;
private var thick:int;
public function Tentacle(x:Number,y:Number,total:int,length:Number,w:Number,h:Number){
Tentacle.jointTotal = total;
Tentacle.jointLength = length;
Tentacle.stageWidth = w;
Tentacle.stageHeight = h;
posAry = new Array();
for (var i:int=0; i<Tentacle.jointTotal; i++){
var pt:Object = new Object();
if (i==0){
pt.x = x;
pt.y = y;
}
else {
var theta:Number = Math.random()*2*Math.PI;
pt.x = posAry[i-1].x + Tentacle.jointLength * Math.cos(theta);
pt.y = posAry[i-1].y + Tentacle.jointLength * Math.sin(theta);
}
posAry.push(pt);
}
colG = Math.ceil(Math.random()*255);
colB = Math.ceil(Math.random()*colG/2 + colG/4);
colR = Math.ceil(Math.random()*colB/2 + colB/4);
thick = Math.ceil(Math.random()*5+2);
addEventListener(Event.ENTER_FRAME, chase);
}
private function drawCurve():void{
graphics.clear();
graphics.moveTo(posAry[0].x,posAry[0].y);
graphics.lineStyle(thick);
for (var i:int=0; i<Tentacle.jointTotal; i++){
if (i == Tentacle.jointTotal-1){
graphics.lineTo(posAry[i].x, posAry[i].y);
}
else {
var xAve:Number = (posAry[i].x + posAry[i+1].x)/2;
var yAve:Number = (posAry[i].y + posAry[i+1].y)/2;
graphics.curveTo(posAry[i].x, posAry[i].y, xAve, yAve);
}
}
transform.colorTransform = new ColorTransform(0,0,0,1,colR,colG,colB,0);
}
private function chase(e:Event):void{
const DEL:int = 5;
var dx:Number;
var dy:Number;
if (mouseX > Tentacle.stageWidth/3 && mouseY > Tentacle.stageHeight/3){
dx = mouseX - posAry[Tentacle.jointTotal-1].x;
dy = mouseY - posAry[Tentacle.jointTotal-1].y;
}
else{
dx = Tentacle.stageWidth - posAry[Tentacle.jointTotal-1].x;
dy = Tentacle.stageHeight - posAry[Tentacle.jointTotal-1].y;
}
posAry[Tentacle.jointTotal-1].x += (dx/DEL)/thick*(Math.random()-0.3);
posAry[Tentacle.jointTotal-1].y += (dy/DEL)/thick*(Math.random()-0.3);
getPosition();
drawCurve();
}
private function getPosition():void{
for (var j:int=1; j<Tentacle.jointTotal; j++){
for (var i:int=Tentacle.jointTotal-1; i>1; i--){
var dx:Number = posAry[i].x - posAry[i-1].x;
var dy:Number = posAry[i].y - posAry[i-1].y;
var theta:Number = Math.atan2(dy,dx);
posAry[i-1].x = posAry[i-2].x + Tentacle.jointLength*Math.cos(theta);
posAry[i-1].y = posAry[i-2].y + Tentacle.jointLength*Math.sin(theta);
}
}
}
}
}
SpinningMoon.as (月)
package{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.utils.Timer;
import flash.filters.DisplacementMapFilter;
public class SpinningMoon extends Sprite{
[Embed(source="moonMap.png")]
private var IMG:Class;
private static var stageWidth:Number;
private static var stageHeight:Number;
private var sphere:Bitmap;
private var textureMap:BitmapData;
private var radius:Number;
private var sourceX:int;
public function SpinningMoon(xPos:Number,yPos:Number,w:Number,h:Number){
SpinningMoon.stageWidth = w;
SpinningMoon.stageHeight = h;
textureMap = new IMG().bitmapData;
sourceX = textureMap.width/2;
radius = textureMap.height/2;
sphere = new Bitmap();
sphere.bitmapData = new BitmapData(textureMap.width/2,textureMap.height);
sphere.bitmapData.copyPixels(textureMap,
new Rectangle(0,0,sphere.width,sphere.height), new Point(0,0));
var fisheyeLens:BitmapData = createFisheyeMap(radius);
var dsp:DisplacementMapFilter = new DisplacementMapFilter(
fisheyeLens,new Point(0,0),
BitmapDataChannel.RED,BitmapDataChannel.BLUE,radius,0);
sphere.filters = [dsp];
sphere.x = xPos - radius;
sphere.y = yPos - radius;
addChild(sphere);
var moonMask:Shape = new Shape();
moonMask.graphics.beginFill(0x0,1);
moonMask.graphics.drawCircle(xPos,yPos,radius);
addChild(moonMask);
this.mask = moonMask;
var rotationTimer:Timer = new Timer(15);
rotationTimer.addEventListener(TimerEvent.TIMER, rotateMoon);
rotationTimer.start();
}
private function rotateMoon(e:TimerEvent):void{
if (mouseX > SpinningMoon.stageWidth/3 && mouseY > SpinningMoon.stageHeight/3){
sourceX--;
if (sourceX < 0){
sourceX = textureMap.width/2;
}
}
else{
sourceX++;
if (sourceX > textureMap.width/2){
sourceX = 0;
}
}
sphere.bitmapData.copyPixels(textureMap,
new Rectangle(sourceX,0,sphere.width,sphere.height),new Point(0,0));
e.updateAfterEvent();
}
private function createFisheyeMap(radius:int):BitmapData{
var diameter:int = 2 * radius;
var result:BitmapData = new BitmapData(diameter,diameter,false,0x808080);
for (var i:int = 0; i < diameter; i++){
for (var j:int = 0; j < diameter; j++){
var pctX:Number = (i - radius) / radius;
var pctY:Number = (j - radius) / radius;
var pctDistance:Number = Math.sqrt(pctX * pctX + pctY * pctY);
if (pctDistance < 1){
var red:int;
var green:int;
var blue:int;
var rgb:uint;
red = 128 * (1 + 0.75 * pctX * pctX * pctX / (1 - pctY * pctY));
green = 0;
blue = 0;
rgb = (red << 16 | green << 8 | blue);
result.setPixel(i, j, rgb);
}
}
}
return result;
}
}
}
Stars.as (星)
package{
import flash.display.Sprite;
import flash.display.Shape;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class Stars extends Sprite{
private static var stageWidth:Number;
private static var stageHeight:Number;
private static const TOTAL:int = 50;
private var sprAry:Array;
private var sizeAry:Array;
public function Stars(w:Number,h:Number){
Stars.stageWidth = w;
Stars.stageHeight = h;
sprAry = new Array();
sizeAry = new Array();
for (var i:int=0; i<TOTAL; i++){
var x:Number = Math.random()*Stars.stageWidth;
var y:Number = Math.random()*Stars.stageHeight;
var rad:Number = Math.random()*2;
var star:Shape = new Shape();
star.graphics.lineStyle(0);
star.graphics.beginFill(0xFFFFFF,1);
star.graphics.drawCircle(0,0,rad);
star.x = x;
star.y = y;
addChild(star);
sprAry.push(star);
sizeAry.push(rad);
}
var moveTimer:Timer = new Timer(30);
moveTimer.addEventListener(TimerEvent.TIMER, run);
moveTimer.start();
}
private function run(e:TimerEvent):void{
for (var i:int=0; i<TOTAL; i++){
if (mouseX > Stars.stageWidth/3 && mouseY > Stars.stageHeight/3){
sprAry[i].x += sizeAry[i];
if (sprAry[i].x > Stars.stageWidth){
sprAry[i].x = 0;
}
}
else{
sprAry[i].x -= sizeAry[i];
if (sprAry[i].x < 0){
sprAry[i].x = Stars.stageWidth;
}
}
}
}
}
}
Powered by blog Boreal Kiss 2008.