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;
        
        //Number of tentacles
        private static const WEED_TOTAL:int = 50;
        //Number of joints per tentacle
        private static const JOINT_TOTAL:int = 5;
        //Length between joints
        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;
        
        //style
        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){
                    //root
                    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);
            }
            
            //color & thickness
            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{
            //delete the old graphics
            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{
        [(source="moonMap.png")]
        private var IMG:Class;
        
        //new
        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){
            
            //new
            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);
            
            //initialize
            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];
            
            //the center of the sphere will be placed on (xPos,yPos)
            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{
                //reverse
                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{
                    //reverse
                    sprAry[i].x -= sizeAry[i];
                    if (sprAry[i].x < 0){
                        sprAry[i].x = Stars.stageWidth;
                    }
                }
            }
        }
    }
}
Powered by blog Boreal Kiss 2008.