zoukankan      html  css  js  c++  java
  • flare3d_Particles粒子

    按照下列步骤在 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;
    }
    }






  • 相关阅读:
    Windows10右键添加“在此处打开命令窗口"
    赋值简单理解
    应用 EditPlus 配置 Java 编译环境
    进程和线程的区别
    Java栈与堆
    进程与线程的简单解释
    java的多态性(二)
    内部类详解(很详细)
    java的super和this关键字用法总结
    Java类成员(成员变量和方法)的覆盖与隐藏归纳
  • 原文地址:https://www.cnblogs.com/xiaowai/p/2349448.html
Copyright © 2011-2022 走看看