群集モデリングのパーティクルシステム(3)

2014年10月4日(クラウドモデリングのパーティクルシステム(2) )から会話を続けます。



このパートでは:

  1. シューターの死を追加します(結局、爆発を殺します)
  2. エミッタの設定で遊ぶ-私は叙事詩が欲しい




シューターの死を追加します(結局、爆発を殺します)



「矢を殺す」ためには、多くの異なる方法があります。 最も一般的なものを選択します-特定の「健康の量」をゼロ以下に減らします。 しかし、何かを減らすためには、まずこれにヘルスを提供する必要があります-( HealthInitializer )。

HealthInitializerを使用したパーティクルの初期化中に、新しいユーザー変数「health」が Particle.dictionaryクラスのプロパティに追加されます



package waylines.initializers { import org.flintparticles.common.particles.Particle; import org.flintparticles.common.emitters.Emitter; import org.flintparticles.common.initializers.InitializerBase; public class HealthInitializer extends InitializerBase { private var health:int; public function HealthInitializer(health:int=100) { this.health = health; } override public function initialize( emitter : Emitter, particle : Particle ) : void { particle.dictionary["health"] = health; } } }
      
      







パーティクルはヘルスを獲得し、今では減らすことができます。

メインコードの変更:



 override protected function setup(e:Event=null):void { super.setup(e); //  " "   -  emitterWaylines.addInitializer( new HealthInitializer(100)); }
      
      





 /* *   (     -     ) * 1.   explosion ""   emitterWaylines     emitterExplosion * 2.          . *   ,  ""    * -     ,      */ override protected function explosion(e:MouseEvent):void { /* *     -     emitterWaylines */ super.explosion(e); /* *  copy-paste   * ,          */ ... var particles:Array = emitterExplosion.particlesArray; var length:int = particles.length; for(var r:int=0; r<length; r++) { ... if(Point.distance(explPoint, particlePoint) < explRadius) { particleClone = Particle2D(particles[r]); particleClone.angVelocity = -5 + Math.random() * 10; /* *  " "   " " -    ... */ particleClone.lifetime += 1; //particleClone.age = 0; /* *       ( 10  40 ) */ particleClone.dictionary["health"] -= (10 + Math.random() * 30); } } }
      
      







すべてが機能します。 彼が負傷したのは誰で、誰を殺したのかは明らかではありません。 ズボンの矢印の色の区別を追加できます。

MainWaylines_3.explosion()に数行を挿入します:



 /* *        -    ,    */ if(particle.dictionary["health"] <= 0) { //  "" -   addBlot(particle); //   particle.isDead = true; } else { //  "" -   Arrow(particle.image).color = getArrayColorByHealth(particle.dictionary["health"]); }
      
      







エミッタの設定で遊ぶ-私は叙事詩が欲しい



粒子ライブラリーは、アプリケーションでの作業の基礎として使用され、物理法則(質量、重力など)で動作します。 はい、確かに独自のアドオンを作成する必要があります-これは非常に望ましくありません(購入した子供用ブロックのようにプログラミングで遊んで、旋盤で磨かないでください)。

したがって:





 override protected function setup(e:Event=null):void { super.setup(e); //  " "   -  emitterWaylines.addInitializer( new HealthInitializer(100)); /* * " "    (  ) * - - .1 */ emitterWaylines.maximumFrameTime = .001; emitterWaylinesForMonsterArrows.maximumFrameTime = .001; /* * -      ,   ,    * (,        -        ,    ) */ emitterWaylines.addAction( new Antigravities(emitterWaylinesForMonsterArrows, -4000000) );//  400000 emitterWaylines.addAction( new MinimumDistance( 7, 6000 ) );//  600 }
      
      







その結果、潜在的な敵は、マップに対する相対的なサイズに比例して、はるかにゆっくりと動き始めました(たとえば、ゴブリンやゾンビの場合)。 マップ自体をスケーリングすることができ、粒子の座標はより大きな(より小さな)画面に外挿されます。







まあ、実際、これは私が共有したかったものです-パーティクルシステムを使用した群衆モデリングの原理。 その結果、タワーディフェンスのほぼ完成したプロトタイプモデル(MVC)が完成しました。 もちろん、このような粒子密度では60 fpsを達成することはできません...しかし-最適化することがたくさんあります(前のパートで述べました)、フリーレンダリングをねじ込みます(スターリング、Away3d)



コードはgoogle codeで入手できます 。 クラスMainWaylines_3



PS:時間があります、私は間違いなくねじ込みレンダリングを表示します



All Articles