XNAメモ – 小規模な2Dパーティクルエフェクトの実装3

Posted: 2012年2月10日 カテゴリー: プログラミングメモ, XNA, XNAメモ
タグ:, , , , , , , , ,

今回は、前2回で作ったパーティクルシステムに、円形の様なエフェクトを追加します。

今回は実装方法として、一つのメソッド(Emit()メソッド)で別のエフェクトを作製します。なので、まずエフェクトの種類を表すenumを宣言します。

enum ParticleType
{
Linear, // 同じ速度のエフェクト
Spread, // ランダムな速度で移動
}

次に、Emit()メソッドに、ParticleTypeを渡せるようにします。その後に、ParticleTypeによって違う速度のパーティクルを作るようにメソッドの内容を変更します。

public void Emit(ParticleType type, Texture2D tex, Vector2 pos, int minAngle, int maxAngle, float scale,
float shrinkRate, float duration, int amount, int maxSpeed, Color colour)
{
Particle p;
float angle = 0.0f;
float speed = 0.0f;

for (int i = 0; i < amount; i++)
{
// ランダムな角度を獲得する
angle = m_rand.Next(minAngle, maxAngle);

if (type == ParticleType.Linear)
{
// 一定の速度を設定する。
speed = maxSpeed;
}

else if (type == ParticleType.Spread)
{
// ランダムな速度を獲得する
speed = m_rand.Next(1, maxSpeed);
}

// 新しいパーティクルを作る
p = new Particle(tex, pos, speed, angle, scale, shrinkRate, duration, colour);

// パーティクルを足す
m_particles.Add(p);
}
}

後は、Emit()メソッドの呼び出しを変更するだけです。最初のエフェクトは、360度に向けて作成され、二つ目は150~230度に向けて作成されます。

protected override void Update(GameTime gameTime)
{
// スペースキーが押されたら
if (Input.IsPressed(Keys.Space))
{
// パーティクルを作る
emitter.Emit(ParticleType.Linear, particleTex, new Vector2(300, 300), 0, 360, 1.0f, 1.0f, 1.5f, 100, 200, Color.Gold);
}

if (Input.IsPressed(Keys.Z))
{
float scale = 0.5f;
float shrink = 0.5f;
int speed = 600;
int min = 150;
int max = 230;
Vector2 pos = new Vector2(350, 200);
emitter.Emit(ParticleType.Linear, particleTex, pos, min, max, scale, shrink, 1.0f, 40, speed, Color.Salmon);
emitter.Emit(ParticleType.Linear, particleTex, pos, min, max, scale, shrink, 2.5f, 40, speed, Color.Pink);
emitter.Emit(ParticleType.Linear, particleTex, pos, min, max, scale, shrink, 2.0f, 40, speed, Color.Crimson);
}

// パーティクルの更新
emitter.Update((float)gameTime.ElapsedGameTime.TotalSeconds);

base.Update(gameTime);
}

変更後はこんな感じになります。

以上です。気が向いたら別のエフェクトも追加してみますが、やるかどうかは今の所未定です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中