Actionscript 3 流场动作脚本:如何将三角形(BOID)外观更改为png图像?

Actionscript 3 流场动作脚本:如何将三角形(BOID)外观更改为png图像?,actionscript-3,flash,Actionscript 3,Flash,我想知道是否有办法将“粒子”的外观更改为我创建的图像。我发现实验室在 我一直在想我怎样才能把我创造的鸟上传到草图上 有人愿意帮我弄清楚这是否可能吗 /** * * FlowField v1.00 * 14/12/2008 17:53 * * © JUSTIN WINDLE | soulwire ltd * http://blog.soulwire.co.uk * **/ package { import flash.display.Bitma

我想知道是否有办法将“粒子”的外观更改为我创建的图像。我发现实验室在

我一直在想我怎样才能把我创造的鸟上传到草图上

有人愿意帮我弄清楚这是否可能吗

/**     
 * 
 *  FlowField v1.00
 *  14/12/2008 17:53
 * 
 *  © JUSTIN WINDLE | soulwire ltd
 *  http://blog.soulwire.co.uk
 * 
 **/

package  
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.ColorTransform;
    import flash.geom.Point;
    import flash.utils.getTimer;

    public class FlowField extends Sprite
    {

        //___________________________________________________________       _____
        //————————————————————————————————————————————— CLASS MEMBERS       VALUE

        private static const MARGIN:        int = 10;
        private static const UI_Y_OPEN:     int = 200;
        private static const UI_Y_CLOSED:   int = 314;
        private static const FADING:        ColorTransform = new ColorTransform(1, 1, 1, 0.99);

        //———————————————————————————————————————————————————————————

        private var _offsets:               Array       = [];
        private var _offsetSpeed1:          Number      = 2.0;
        private var _offsetSpeed2:          Number      = -2.0;
        private var _speedMultiplier:       Number      = 2.0;
        private var _numParticles:          int         = 1000;
        private var _noiseSeed:             int         = 1000;
        private var _baseX:                 int         = 180;
        private var _baseY:                 int         = 180;
        private var _settingsOpen:          Boolean     = false;
        private var _useBlitting:           Boolean     = false;

        private var _renderBMD:             BitmapData;
        private var _noiseBMD:              BitmapData;
        private var _renderBMP:             Bitmap;
        private var _noiseBMP:              Bitmap;
        private var _particles:             Sprite;

        //___________________________________________________________
        //————————————————————————————————————————— GETTERS + SETTERS

        public function set numParticles( value:int ):void
        {
            _numParticles = value;
            ui.particlesTF.text = value.toString();

            if ( _numParticles > _particles.numChildren )
            {
                var particle:Particle;

                while ( _particles.numChildren < _numParticles )
                {
                    particle = new Particle();

                    particle.x = Math.random() * stage.stageWidth;
                    particle.y = Math.random() * stage.stageHeight;

                    _particles.addChild( particle );
                }
            }
            else if ( _numParticles < _particles.numChildren )
            {
                while ( _particles.numChildren > _numParticles )
                {
                    _particles.removeChildAt( _numParticles );
                }
            }
        }

        public function set noiseSeed( value:int ):void
        {
            _noiseSeed = value;
            ui.seedTF.text = value.toString();
        }

        public function set baseX( value:int ):void
        {
            _baseX = value;
            ui.baseXTF.text = value.toString();
        }

        public function set baseY( value:int ):void
        {
            _baseY = value;
            ui.baseYTF.text = value.toString();
        }

        public function set offsetSpeed1( value:Number ):void
        {
            _offsetSpeed1 = value;
            ui.offset1TF.text = value.toString();
        }

        public function set offsetSpeed2( value:Number ):void
        {
            _offsetSpeed2 = value;
            ui.offset2TF.text = value.toString();
        }

        public function set speedMultiplier( value:Number ):void
        {
            _speedMultiplier = value;
            ui.pSpeedTF.text = value.toString();
        }

        public function set useBlitting( value:Boolean ):void
        {
            _useBlitting = value;

            if ( _useBlitting )
            {
                Particle.COLOUR = 0xFFFFFF;

                removeChild( _particles );
                addChild( _renderBMP );
            }
            else
            {
                Particle.COLOUR = 0x111111;

                removeChild( _renderBMP );
                addChild( _particles );
            }

            for (var i:int = 0; i < _numParticles; i++) 
            {
                Particle( _particles.getChildAt(i) ).draw();
            }

            addChild( _noiseBMP );
            addChild( ui );
        }

        //___________________________________________________________
        //——————————————————————————————————————————————— CONSTRUCTOR

        public function FlowField() 
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.MEDIUM;
            stage.align = StageAlign.TOP_LEFT;

            _offsets.push( new Point() );
            _offsets.push( new Point() );

            _noiseSeed = Math.random() * 2000 << 0;

            _renderBMD = new BitmapData( stage.stageWidth, stage.stageHeight, false, 0 );
            _renderBMP = new Bitmap( _renderBMD );
            addChild( _renderBMP );

            _noiseBMD = new BitmapData( stage.stageWidth, stage.stageHeight );
            _noiseBMD = new BitmapData( stage.stageWidth + (MARGIN * 4), stage.stageHeight + (MARGIN * 4), false );
            _noiseBMP = new Bitmap( _noiseBMD );
            _noiseBMP.visible = false;
            addChild( _noiseBMP );

            createParticles();
            configureListeners();

            useBlitting = false;
        }

        //___________________________________________________________
        //——————————————————————————————————————————————————— METHODS



        //———————————————————————————————————————————————————————————

        private function createParticles():void
        {
            _particles = new Sprite();
            addChild( _particles );
            addChild( ui );

            for (var i:int = 0; i < _numParticles; i++) 
            {
                var particle:Particle = new Particle();
                particle.x = Math.random() * stage.stageWidth;
                particle.y = Math.random() * stage.stageHeight;
                _particles.addChild( particle );
            }
        }

        private function configureListeners():void
        {
            ui.particlesSlider.addEventListener( Event.CHANGE, onSliderChange );
            ui.seedSlider.addEventListener( Event.CHANGE, onSliderChange );
            ui.baseXSlider.addEventListener( Event.CHANGE, onSliderChange );
            ui.baseYSlider.addEventListener( Event.CHANGE, onSliderChange );
            ui.offset1Slider.addEventListener( Event.CHANGE, onSliderChange );
            ui.offset2Slider.addEventListener( Event.CHANGE, onSliderChange );
            ui.pSpeedSlider.addEventListener( Event.CHANGE, onSliderChange );
            ui.showNoiseCB.addEventListener( Event.CHANGE, onCBSelect );
            ui.blitCB.addEventListener( Event.CHANGE, onCBSelect );

            ui.particlesSlider.value = _numParticles;
            ui.particlesTF.text = _numParticles.toString();

            ui.seedSlider.value = _noiseSeed;
            ui.seedTF.text = _noiseSeed.toString();

            ui.baseXSlider.value = _baseX;
            ui.baseXTF.text = _baseX.toString();

            ui.baseYSlider.value = _baseY;
            ui.baseYTF.text = _baseX;

            ui.offset1Slider.value = _offsetSpeed1;
            ui.offset1TF.text = _offsetSpeed1.toString();

            ui.offset2Slider.value = _offsetSpeed2;
            ui.offset2TF.text = _offsetSpeed2.toString();

            ui.pSpeedSlider.value = _speedMultiplier;
            ui.pSpeedTF.text = _speedMultiplier.toString();

            addEventListener( Event.ENTER_FRAME, update );
        }

        //___________________________________________________________
        //———————————————————————————————————————————— EVENT HANDLERS

        private function update( event:Event ):void
        {
            _offsets[0].x += _offsetSpeed1;
            _offsets[0].y += _offsetSpeed1;

            _offsets[1].x += _offsetSpeed2;
            _offsets[1].y += _offsetSpeed2;

            _noiseBMD.perlinNoise( _baseX, _baseY, 2, _noiseSeed, false, true, 10, true, _offsets );

            var particle:Particle;
            var brightness:Number;
            var radians:Number;
            var angle:Number;
            var speed:Number;
            var pixel:int;

            for (var i:int = 0; i < _particles.numChildren; i++) 
            {
                particle = _particles.getChildAt(i) as Particle;
                pixel = _noiseBMD.getPixel( particle.x + (MARGIN *2), particle.y + (MARGIN *2) );

                brightness = pixel / 0xFFFFFF;
                speed = 0.1 + brightness * particle.speed * _speedMultiplier;
                angle = 360 * brightness * particle.wander;
                radians = angle * Math.PI / 180;

                particle.x += Math.cos( radians ) * speed;
                particle.y += Math.sin( radians ) * speed;
                particle.scaleX = particle.scaleY = 0.1 + brightness * (_useBlitting ? 4 : 6);
                particle.rotation = angle;

                if ( particle.x < -MARGIN ) particle.x = stage.stageWidth + MARGIN;
                else if ( particle.x > stage.stageWidth + MARGIN ) particle.x = -MARGIN;

                if ( particle.y < -MARGIN ) particle.y = stage.stageHeight + MARGIN;
                else if ( particle.y > stage.stageHeight + MARGIN ) particle.y = -MARGIN;
            }

            if ( _useBlitting )
            {
                _renderBMD.colorTransform( _renderBMD.rect, FADING );
                _renderBMD.draw( _particles );
            }

            if ( !_settingsOpen && mouseY > UI_Y_CLOSED )
            {
                _settingsOpen = true;
            }
            else if ( _settingsOpen && mouseY < UI_Y_OPEN )
            {
                _settingsOpen = false;
            }

            if ( _settingsOpen && ui.y > UI_Y_OPEN )
            {
                ui.y += (UI_Y_OPEN - ui.y) / 3;
            }
            else if ( !_settingsOpen && ui.y < UI_Y_CLOSED )
            {
                ui.y += (UI_Y_CLOSED -ui.y) / 3;
            }
        }

        private function onSliderChange( event:Event ):void
        {
            switch( event.currentTarget )
            {
                case ui.particlesSlider : numParticles      = event.currentTarget.value; break;
                case ui.seedSlider      : noiseSeed         = event.currentTarget.value; break;
                case ui.baseXSlider     : baseX             = event.currentTarget.value; break;
                case ui.baseYSlider     : baseY             = event.currentTarget.value; break;
                case ui.offset1Slider   : offsetSpeed1      = event.currentTarget.value; break;
                case ui.offset2Slider   : offsetSpeed2      = event.currentTarget.value; break;
                case ui.pSpeedSlider    : speedMultiplier   = event.currentTarget.value; break;
            }
        }

        private function onCBSelect( event:Event ):void
        {
            switch( event.currentTarget )
            {
                case ui.showNoiseCB :   _noiseBMP.visible = ui.showNoiseCB.selected; break;
                case ui.blitCB      :   useBlitting = ui.blitCB.selected; break;
            }
        }

    }

}

import flash.display.Shape;

internal class Particle extends Shape
{
    public static var COLOUR:uint = 0x111111;

    public static const MIN_SPEED:int = 1;
    public static const MAX_SPEED:int = 4;

    public static const MIN_WANDER:Number = 0.8;
    public static const MAX_WANDER:Number = 1.2;

    public var speed:Number;
    public var wander:Number;

    public function Particle()
    {
        speed = Math.random() * (MAX_SPEED - MIN_SPEED) + MIN_SPEED;
        wander = Math.random() * (MAX_WANDER - MIN_WANDER) + MIN_WANDER;
        draw();
    }

    public function draw()
    {
        graphics.clear();
        graphics.beginFill( COLOUR );
        graphics.moveTo( -1, -0.5);
        graphics.lineTo( 1, 0);
        graphics.lineTo( -1, 0.5);
        graphics.lineTo( -1, -0.5);
        graphics.endFill();
    }
}
/**
* 
*流场v1.00
*  14/12/2008 17:53
* 
*©JUSTIN WINDLE | soulwire有限公司
*  http://blog.soulwire.co.uk
* 
**/
包裹
{
导入flash.display.Bitmap;
导入flash.display.BitmapData;
导入flash.display.Sprite;
导入flash.display.StageAlign;
导入flash.display.statequality;
导入flash.display.StageScaleMode;
导入flash.events.Event;
导入flash.geom.ColorTransform;
导入flash.geom.Point;
导入flash.utils.getTimer;
公共级流场扩展Sprite
{
//___________________________________________________________       _____
//---------------------------------------------班级成员价值观
专用静态常量边距:int=10;
私有静态常量UI_Y_OPEN:int=200;
私有静态常量UI_Y_关闭:int=314;
私有静态常数衰减:ColorTransform=新的ColorTransform(1,1,1,0.99);
//———————————————————————————————————————————————————————————
私有var_偏移量:数组=[];
私人var _offsetSpeed1:Number=2.0;
私人var _offsetSpeed2:Number=-2.0;
私有变量(speedMultiplier):Number=2.0 ;;
私有变量:int=1000;
私有var_noiseed:int=1000;
私有var_baseX:int=180;
私有var _baseY:int=180;
private var_settingsOpen:Boolean=false;
私有变量_useBlitting:Boolean=false;
私有变量renderBMD:BitmapData;
私有变量noiseBMD:BitmapData;
私有变量renderBMP:位图;
私有变量noiseBMP:位图;
私人变形金刚粒子:精灵;
//___________________________________________________________
//-----------------------------------------接受者+接受者
公共函数集numParticles(值:int):void
{
_numParticles=值;
ui.particlesTF.text=value.toString();
如果(\u numParticles>\u particles.numChildren)
{
var粒子:粒子;
而(_particles.numChildren<_numParticles)
{
粒子=新粒子();
particle.x=Math.random()*stage.stageWidth;
particle.y=Math.random()*stage.stageHeight;
_particles.addChild(particle);
}
}
否则如果(\u numParticles<\u particles.numChildren)
{
而(\u particles.numChildren>\u numParticles)
{
_颗粒。去除childat(_numParticles);
}
}
}
公共函数集Noiseed(值:int):无效
{
_noiseed=值;
ui.seedTF.text=value.toString();
}
公共函数集baseX(值:int):void
{
_baseX=值;
ui.baseXTF.text=value.toString();
}
公共函数集baseY(值:int):void
{
_baseY=值;
ui.baseYTF.text=value.toString();
}
公共功能集offsetSpeed1(值:Number):无效
{
_offsetSpeed1=值;
ui.offset1TF.text=value.toString();
}
公共功能集offsetSpeed2(值:Number):无效
{
_offsetSpeed2=值;
ui.offset2TF.text=value.toString();
}
公共函数集speedMultiplier(值:Number):无效
{
_速度乘数=数值;
ui.pSpeedTF.text=value.toString();
}
公共函数集UseBiliting(值:布尔值):void
{
_useBlitting=值;
如果(_usebiliting)
{
Particle.color=0xFFFFFF;
去除细胞(_粒子);
addChild(_renderBMP);
}
其他的
{
Particle.color=0x111111;
removeChild(_renderBMP);
addChild(_粒子);
}
对于(变量i:int=0;i<\u numParticles;i++)
{
粒子(_particles.getChildAt(i)).draw();
}
addChild(_noiseBMP);
addChild(ui);
}
//___________________________________________________________
//-----------------------------------------------建造师
公共函数流场()
{
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.quality=stage.MEDIUM;
stage.align=StageAlign.TOP\u左;
_偏移。推(新点());
_偏移。推(新点());
_noiseed=Math.random()*2000 stage.stageWidth+MARGIN)particle.x=-MARGIN;
如果(particle.y<-MARGIN)particle.y=stage.stageHeight+MARGIN;