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;