サイトのトップへ戻る

AndEngineドキュメント 日本語訳

チュートリアル - AndEngineで雪を降らせる方法

雪を降らせる簡単な方法は、パーティクルシステムを使用することです。 正しいパラメータを使用すれば、リアルな降雪の演出を作成することができます。 一定方向の風を吹かせる演出も問題ありません。 しかし私のゲームの場合は、アニメ調の見た目で上手く揺動運動させて雪を降らせる必要がありました。 その際に使った方法を記載します。

まずは簡単なパーティクルシステムを使ってやってみましょう。一つの雪の欠片を表すsprite が必要です。 画面サイズは 800x480 ピクセルです。

  
final BatchedPseudoSpriteParticleSystem particleSystem = new BatchedPseudoSpriteParticleSystem(
    new RectangleParticleEmitter(CAMERA_WIDTH / 2, CAMERA_HEIGHT, CAMERA_WIDTH, 1),
    2, 5, 100, mSnowParticleRegion, 
    this.getVertexBufferObjectManager()
  );
particleSystem.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE);
particleSystem.addParticleInitializer(new VelocityParticleInitializer<Entity>(-3, 3, -20, -40));
particleSystem.addParticleInitializer(new AccelerationParticleInitializer<Entity>(-3, 3, -3, -5));
particleSystem.addParticleInitializer(new RotationParticleInitializer<Entity>(0.0f, 360.0f));
particleSystem.addParticleInitializer(new ExpireParticleInitializer<Entity>(10f));
particleSystem.addParticleInitializer(new ScaleParticleInitializer<Entity>(0.2f, 0.5f));


particleSystem.addParticleModifier(new AlphaParticleModifier<Entity>(6f, 10f, 1.0f, 0.0f));

scene.attachChild(particleSystem);
  • VelocityParticleInitializer - tells the particle system to shoot particles softly to left and right (-3 and 3 is "speed") and a bit faster down
  • AccelerationParticleInitializer - velocityと同様、雪に加速度を与えます(時間をかけて少しずつ加速していきます)
  • RotationParticleInitializer - 雪の欠片をランダムに回転させます (今回のパーティクルはほとんど円形なので、回転させてもあまり意味はないですが)
  • ExpireParticleInitializer - パーティクルが期限切れになる(非表示になる)までに10秒かかります。 this is about the time the fastest reaches the bottom of the screen
  • ScaleParticleInitializer - パーティクルは元のSpriteの20%から50%の大きさに変更されます
  • AlphaParticleModifier - これは唯一の modifier です。6秒経過すると雪の欠片がフェードアウトし始めます。

これを使用すると素晴らしい降雪を表示できますが、全てのパーティクルはほとんど真っ直ぐに移動します。 You can simply write some random particle modifier that will push the particle left or right to give it a bit of realism.  しかし、もし揺動運動を実装したい場合には困ります。 Notice that we are creating only one Modifier object for all particles. Modifierは状態情報を持っていません - ステートレスです。 They can work with the current particle and the particle has a state. ModifierはEntity(例えばSprite)への参照を保持しています。 そのため全てのEntityのプロパティにアクセスできます。

揺動運動を実装するのは本当に簡単ですが、状態情報は使用しません。 では、どのように揺動運動を実装するのでしょうか? 全てのパーティクルに新規modifier を用意するのです。やり方は以下通り:

まず最初に、各パーティクルにmodifier を追加するためのparticle initializerを作成します。

  
public class YourEntityModifierParticleInitializer<T extends IEntity> implements
    IParticleInitializer<T> {
  
  @Override
  public void onInitializeParticle(Particle<T> pParticle) {

      pParticle.getEntity().registerEntityModifier(
           new YourEntityModifier());

  }
}

そして、initializerに以下を追加します:

  
particleSystem.addParticleInitializer(new YourEntityModifierParticleInitializer());

そして、initializerに任意の情報を渡すことができます。もしくは単にinitializer内のEntityから情報を取得します。 entity modifierの揺動運動はどのようになったでしょうか? 以下の私が作成したmodifier では、増加正弦波を使って揺動運動を実現しています。 重要な部分のみを以下に示します:

  
public class PositionXSwingModifier extends SingleValueSpanEntityModifier {
...
  public PositionXSwingModifier(float pDuration, float pFromValue, float pToValue,
        float pFromMagnitude, float pToMagnitude) {
    // fromValue is usually 0
    // toValue means how many times will the sine wave oscillate
    // every 2pi is full sin wave
    super(pDuration, pFromValue, pToValue);
    mFromMagnitude = pFromMagnitude;
    mToMagnitude = pToMagnitude;
  }
...

  @Override
  protected void onSetValue(IEntity pItem, float pPercentageDone, float pValue) {
    // current magnitude based on percentage
    float currentMagnitude = mFromMagnitude + (mToMagnitude - mFromMagnitude) * pPercentageDone;
    // current sine wave value
    float currentSinValue = (float) Math.sin(pValue);
    // change the x position of the flake
    pItem.setX(mInitialX + currentMagnitude * currentSinValue);
  }

...
}

modifier にランダムなパラメータを付けて各パーティクル に設定する、独自のイニシャライザーを作成しました。そして以下が初期化方法です:

 
particleSystem.addParticleInitializer(
  new RegisterXSwingEntityModifierInitializer(
    10f, 0f, (float) Math.PI * 8, 3f, 25f, true));

以下からソースコードの付いた完全なEclipseプロジェクト (particle textureを含む) とapkがダウンロードできます:

プロジェクトをダウンロード
APKファイルをダウンロード