このパートでは:
- シューターの死を追加します(結局、爆発を殺します)
- エミッタの設定で遊ぶ-私は叙事詩が欲しい
シューターの死を追加します(結局、爆発を殺します)
「矢を殺す」ためには、多くの異なる方法があります。 最も一般的なものを選択します-特定の「健康の量」をゼロ以下に減らします。 しかし、何かを減らすためには、まずこれにヘルスを提供する必要があります-( 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; } } }
パーティクルはヘルスを獲得し、今では減らすことができます。
メインコードの変更:
- 新しいプロパティを初期化する
- 親メソッドMainWaylines_2.explosionを拡張します
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"]); }
エミッタの設定で遊ぶ-私は叙事詩が欲しい
粒子ライブラリーは、アプリケーションでの作業の基礎として使用され、物理法則(質量、重力など)で動作します。 はい、確かに独自のアドオンを作成する必要があります-これは非常に望ましくありません(購入した子供用ブロックのようにプログラミングで遊んで、旋盤で磨かないでください)。
したがって:
- 必要なだけエミッターを遅くします(100倍)
- 加速パラメータを増やしました(10倍) 新しいMinimumDistance(7、6000)
- 「反重力」のパワーを増加(10倍) 新しい反重力(emitterWaylinesForMonsterArrows、-4000000)
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:時間があります、私は間違いなくねじ込みレンダリングを表示します