改动后的Satellite_ActionScript3开发人员指南第11章例子

Satellite.as

 1 package
 2 {
 3     import flash.display.Shape;
 4     
 5     public class Satellite extends Shape {
 6         public var position:Number;
 7         public var color:uint;
 8         public var radius:Number;
 9         public var orbitRadius:Number;
10         
11         public function Satellite(position:Number,color:uint) {
12             this.position = position;
13             this.color = color;
14         }
15         public function draw(useAlphaEffect:Boolean = false):void {
16             var radians:Number = getRadians(position);
17             var posX:Number = Math.sin(radians) * orbitRadius;
18             var posY:Number = Math.cos(radians) * orbitRadius;
19             graphics.clear();
20             graphics.beginFill(color);
21             graphics.drawCircle(posX, posY, radius);
22 
23             alpha = useAlphaEffect ? Math.abs(Math.sin(radians)) : 1;
24         }
25         private function getRadians(degrees:Number):Number {
26             return degrees * Math.PI / 180;
27         }
28         private function getDegrees(radians:Number):uint {
29             return Math.round(180 * radians / Math.PI)
30         }        
31     }

32 }

avg.mxml文件

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    
xmlns:mx="http://www.adobe.com/2006/mxml"
    layout
="absolute"
    creationComplete
="initApp()">
    
    <mx:Script>
        <![CDATA[
            import flash.display.Sprite;
            import flash.display.Shape;
            import flash.events.Event;
            import flash.geom.ColorTransform;
            import flash.display.StageScaleMode;
            import flash.display.StageAlign;
            
            private var satellites:Array;
            private var container:Sprite;
            private var bg:Shape;
            private var radius:Number = 50;
            private var satelliteRadius:Number = 6;
            private var totalSatellites:Number = 600;        
            private var visibleSatellites:Number = 100;
            private var redBias:Number = 0xFF;
            private var greenBias:Number = 0xFF;
            private var blueBias:Number = 0xFF;
            private var useAlphaEffect:Boolean = false;
            private var stageWidth:Number = 600;
            private var stageHeight:Number = 400;
                
            public function initApp():void {
                radiusSlider.addEventListener(Event.CHANGE,changeSetting);
                satelliteRadiusSlider.addEventListener(Event.CHANGE,changeSetting);
                visibleSatellitesSlider.addEventListener(Event.CHANGE,changeSetting);
                redSlider.addEventListener(Event.CHANGE,changeSetting);
                greenSlider.addEventListener(Event.CHANGE,changeSetting);
                blueSlider.addEventListener(Event.CHANGE,changeSetting);
    
                radiusSlider.minimum = 2;
                radiusSlider.maximum = 200;
                radiusSlider.value = radius;
                satelliteRadiusSlider.minimum = 2;
                satelliteRadiusSlider.maximum = 40
                satelliteRadiusSlider.value = satelliteRadius;
                visibleSatellitesSlider.minimum = 0;
                visibleSatellitesSlider.maximum = totalSatellites;
                visibleSatellitesSlider.value = visibleSatellites;
                redSlider.minimum = 
                greenSlider.minimum = 
                blueSlider.minimum = 0;
                redSlider.maximum = 
                greenSlider.maximum = 
                blueSlider.maximum = 0xFF;
                redSlider.value = redBias;
                greenSlider.value = greenBias;
                blueSlider.value = blueBias;
                
                fullScreenBtn.addEventListener(MouseEvent.CLICK, toggleFullScreen);
                alphaShadingBtn.addEventListener(MouseEvent.CLICK, toggleAlphaShading);
                                
                addEventListener(Event.ADDED_TO_STAGE, setStageListener);
                addEventListener(Event.ENTER_FRAME, doEveryFrame);            
                
                build();
            }
            private function setStageListener(e:Event):void {
                stage.scaleMode = StageScaleMode.NO_SCALE;
                stage.align = StageAlign.TOP_LEFT;
                stage.addEventListener(Event.RESIZE,build);
            }
            
            private function clear():void {
                satellites = new Array()
    
                if(container) {
                    drawingArea.removeChild(container);
                }
            }
            private function build(e:Event = null):void {
                clear();
                
                var drawingAreaMask:Sprite = new Sprite();
                drawingAreaMask.graphics.beginFill(0);
                drawingAreaMask.graphics.drawRect(0,120,stageWidth,stageHeight);
                drawingAreaMask.graphics.endFill();
    
                container = new Sprite();
                container.y = 120;
                container.mask = drawingAreaMask;
                drawingArea.addChild(container);
                
                
                bg = new Shape();
                bg.graphics.beginFill(0xEEEEEE);
                bg.graphics.drawRect(0,0,stageWidth,stageHeight);
                container.addChild(bg);
    
                var i:uint;
                for(i=0; i<totalSatellites; i++) {
                    var satelliteContainer:Sprite = new Sprite();
                    satelliteContainer.x = Math.random()*stageWidth;
                    satelliteContainer.y = Math.random()*stageHeight;
                    container.addChild(satelliteContainer);
                    var position:Number = Math.random() * 360;
                    var color:uint = getRandomColor();
                    var satellite:Satellite = new Satellite(position,color);
                    satelliteContainer.addChild(satellite);
                    satellites.push(satellite);
                }
            }
            private function doEveryFrame(e:Event):void {
                var i:uint;
                for(i=0; i<visibleSatellites; i++) {
                    var satellite:Satellite = satellites[i];
                    if(satellite) {
                        satellite.position += 4;
                        satellite.radius = satelliteRadius;
                        satellite.orbitRadius = radius;
                        satellite.draw(useAlphaEffect);
                        satellite.visible = true;
                    }
                }
                while(i < totalSatellites) {
                    var satelliteToHide:Satellite = satellites[i];
                    satelliteToHide.visible = false;
                    i++
                }
            }
            private function getRandomColor():uint {
                var ct:ColorTransform = new ColorTransform(1,1,1,1,Math.random()*redBias,Math.random()*greenBias,Math.random()*blueBias);
                return ct.color;
            }
            
            private function changeSetting(e:Event):void {
                switch(e.target) {
                    case radiusSlider:
                        radius = e.target.value;
                        break;
                    case satelliteRadiusSlider:
                        satelliteRadius = e.target.value;
                        break;
                    case visibleSatellitesSlider:
                        visibleSatellites = e.target.value;
                        break;
                    case redSlider:
                        redBias = e.target.value;
                        build()
                        break;
                    case greenSlider:
                        greenBias = e.target.value;
                        build();
                        break;
                    case blueSlider:
                        blueBias = e.target.value;
                        build()
                        break;
                    default:
                        break;
                }
            }
            private function toggleFullScreen(e:MouseEvent):void {
                stage.displayState = stage.displayState == StageDisplayState.FULL_SCREEN ? StageDisplayState.NORMAL : StageDisplayState.FULL_SCREEN;
            }
            private function toggleAlphaShading(e:MouseEvent):void {
                useAlphaEffect = useAlphaEffect == true ? false : true;
            }            
        
]]>
    </mx:Script>

    <mx:UIComponent id="drawingArea" />

        <mx:HSlider x="110" y="60" id="radiusSlider" width="120"/>
        <mx:HSlider x="110" y="80" id="satelliteRadiusSlider" width="120"/>
        <mx:HSlider x="110" y="100" id="visibleSatellitesSlider" width="120"/>
        <mx:HSlider x="240" y="60" id="redSlider" width="120"/>
        <mx:HSlider x="240" y="80" id="greenSlider" width="120"/>
        <mx:HSlider x="240" y="100" id="blueSlider" width="120"/>
        <mx:Text x="10" y="60" text="Orbit Radius"/>
        <mx:Text x="10" y="78" text="Satellite Radius"/>
        <mx:Text x="10" y="98" text="Visible Satellites"/>
        <mx:Text x="360" y="60" text="Red Bias" textAlign="right" width="76"/>
        <mx:Text x="360" y="78" text="Green Bias" textAlign="right" width="76"/>
        <mx:Text x="360" y="98" text="Blue Bias" textAlign="right" width="76"/>
        <mx:Text x="64" y="4" text="Algorithmic Visual Generator Example" fontFamily="Verdana" fontSize="18" textAlign="center"/>
        <mx:Text x="22" y="31" text="From Programming ActionScript 3.0, Chapter 13: Using the drawing API"/>
        <mx:Button x="455" y="64" label="Alpha Shading" id="alphaShadingBtn"/>
        <mx:Button x="463" y="92" label="Full Screen" id="fullScreenBtn"/>        

    

</mx:Application> 

avg.mxml 与 Satellite.as都在bin目录下。编译多个文件时,只要指定相当于c++中main函数的那个类文件即可。

编译器会自动寻找并编译依赖的其它文件。 

编译方法

 E:\flex_sdk_4.6\bin>mxmlc avg.mxml -source-path=.

 生成的.swf文件

/Files/dreamcs/avg.swf 

 

 

posted @ 2012-05-27 11:15  thinkpore  阅读(173)  评论(0)    收藏  举报