lzosi

用心,才能做出最好吃的菜!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

按照下列步骤在 3D Flash 游戏中使用粒子:

 

  1. 从外部加载纹理文件(Texture3D
  2. 创建一个 ParticleMaterial3D 类以便设置与粒子兼容的纹理、颜色或其它过滤器
  3. 创建一个 particle 类,它扩展 Particle3D 类的功能以便用作一个 particle 模板。覆盖方法 init,更新并且克隆 Particle3D 类以便将期望的行为添加到相应的粒子中。
  4. 使用材料和particle 粒子模板创建一个 ParticleEmiter3D 类。使用 emitParticlesPerFrameparticlesLife 和 decrementPerFram 属性配置相应的发射器(emitter)。
  5. 将emitter绑定(addChild,parent,copyTransformFrom)到发射粒子的物体上面

例1:

public class demo_Particles extends Base {

private var scene:Scene3D;
private var t1:Texture3D;
private var emiter:ParticleEmiter3D;
private var cone:Cone;

public function demo_Particles() {

//scene,camera
scene=new Viewer3D(this);
scene.camera=new Camera3D();
scene.camera.setPosition(0, 200, -400);
scene.camera.lookAt(0, 0, 0);

//texture,material 建立:纹理,材质,发射器
t1=scene.addTextureFromFile("../resources/xingxing.jpg");
var material:ParticleMaterial3D=new ParticleMaterial3D();
material.filters.push(new TextureFilter(t1));
material.filters.push(new ColorParticleFilter([0xffff00, 0xff0000, 0x00ff00, 0x0000ff], [1, 1, 1, 0]));
material.build();
//emiter.
emiter=new ParticleEmiter3D("emiter", material, new CustomParticle());
emiter.useGlobalSpace=true;
emiter.particlesLife=50;
emiter.emitParticlesPerFrame=10;
emiter.parent=cone;
emiter.layer=10;

//加入scene中
cone=new Cone();
cone.addChild(emiter);
scene.addChild(cone);

}
}
public class CustomParticle extends Particle3D
{
private var gravity:Number;
private var velocity:Vector3D = new Vector3D();
private var rotationVelocity:Number = 0;
private var sizeVelocity:Number;

public function CustomParticle()
{

}

override public function clone():Particle3D
{
// return a new custom particle.
// the ParticleEmiter3D will clone all particles he needs.
return new CustomParticle();
}

override public function init( emiter:ParticleEmiter3D ):void
{
super.init( emiter );

/* all particle initialization here. */

super.x = 0;
super.y = 0;
super.z = 0;
super.sizeX = 1;
super.sizeY = 1;

gravity = 0;
velocity.x = Math.random() * 1.0 - 0.5;
velocity.y = Math.random() * 2.0 + 2.0;
velocity.z = Math.random() * 1.0 - 0.5;

if ( emiter.useGlobalSpace ) velocity = emiter.localToGlobalVector( velocity );

velocity.scaleBy( 3 );

rotationVelocity = Math.random() * 0.3 // - 2.5
sizeVelocity = Math.random() * 0.2 + 0.3;
}

override public function update( time:Number ):void
{
/* update the particle. */

gravity -= 0.5;
x += velocity.x;
y += velocity.y + gravity;
z += velocity.z;

if ( y < 0 ) y = 0;

sizeX += sizeVelocity;
sizeY += sizeVelocity;
rotation += rotationVelocity;
}
}


例二:

public class demo_Particles2 extends Base {
private var scene:Scene3D;
private var planet:Pivot3D;

private var smoke:Texture3D;
private var fan:Vector.<Pivot3D>=new Vector.<Pivot3D>();

public function demo_Particles2() {
scene=new Viewer3D(this);
scene.antialias=2;
scene.camera=new Camera3D();
scene.camera.setPosition(120, 120, 120);
scene.camera.lookAt(0, 0, 0);
scene.addEventListener(Scene3D.COMPLETE_EVENT, completeEvent);
scene.pause();
planet=scene.addChildFromFile("../resources/planet.f3d");
smoke=scene.addTextureFromFile("../resources/smoke.png");
}

protected function completeEvent(event:Event):void {
planet.forEach(setupScene);
scene.resume();
scene.addEventListener(Scene3D.UPDATE_EVENT, updateEvent);
}
protected function updateEvent(event:Event):void {
for each (var f:Pivot3D in fan) {
f.rotateY(f.userData.speed);
}
}
private function setupScene(pivot:Pivot3D):void {
if (pivot.name == "fan") {
//旋转
pivot.userData=new Object();
pivot.userData.speed=Math.random() * 5 + 5;
fan.push(pivot);
//粒子
var particles:SmokeEmiter=new SmokeEmiter(smoke);
particles.copyTransformFrom(pivot);
particles.parent=scene;
}
}
}
public class SmokeEmiter extends ParticleEmiter3D 
{
public function SmokeEmiter( texture:Texture3D )
{
// Creates the material to use with the emiter particles.
var material:Shader3D = new ParticleMaterial3D();
material.filters.push( new TextureFilter( texture ) );
material.filters.push( new ColorParticleFilter( [ 0xffffff, 0xffffff, 0xffffff], [ 0, 0.2, 0 ] ) );
material.build();

// Creates the emiter and pass to it the material and the particle template.
super( "smoke", material, new SmokeParticle() );
// The anount of particles to emit each frame.
super.emitParticlesPerFrame = 2;
// How much frames the particles life is.
super.particlesLife = 20;
}
}
class SmokeParticle extends Particle3D
{
private var speed:Number;
private var spin:Number;

override public function init( emiter:ParticleEmiter3D ):void
{
speed = Math.random() * 5;
spin = 0.1;

this.x = Math.random() * 20 - 10;
this.y = Math.random() * 20 - 10;
this.z = Math.random() * 20 - 10;

var scale:Number = emiter.scaleX;

this.sizeX = scale * 2;
this.sizeY = scale * 2;
}

override public function update(time:Number):void
{
this.y += speed;
this.rotation += spin;
this.sizeX *= 1.2;
this.sizeY *= 1.2;
}

override public function clone():Particle3D
{
return new SmokeParticle();
}
}


舞台初始类Base:

public class Base extends Sprite {
public function Base() {
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
}
}






posted on 2012-02-13 14:57  lzosi  阅读(526)  评论(0编辑  收藏  举报