Как создать падающий снег в AndEngine? - PullRequest
3 голосов
/ 06 января 2012

У меня есть этот код:

public Scene onLoadScene() {
    Random randomGenerator = new Random();
    pX = randomGenerator.nextInt(CAMERA_WIDTH);
    Sprite snow = new Sprite (pX, 1, 30, 30, mTextureSnowRegion);
    scene.getLastChild().attachChild(snow);
    return scene;
}

Я пытаюсь сделать снегопад. Я пытался использовать MoveModifier, но ничего не работает. Пожалуйста, помогите.

Ответы [ 4 ]

3 голосов
/ 06 января 2012

Я бы предложил использовать систему частиц в AndEngine: http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/ParticleSystemSimpleExample.java

1 голос
/ 06 сентября 2013

Я использую аналогичные системы частиц, как @UncleIstvan.

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);

Но я добавил модификатор сущности для каждой частицы:

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

Требуется пользовательский инициализатор частиц. В инициализаторе я регистрирую новый модификатор для каждой частицы:

@Override
public void onInitializeParticle(Particle<T> pParticle) {
        pParticle.getEntity().registerEntityModifier(
                new PositionXSwingModifier(mDuration, 
                        mFromValue, mToValue, 
                        mFromMagnitude, mToMagnitude));

}

И последняя часть - это модификатор, который использует растущую синусоидальную волну для создания колебательного движения (некоторые части опущены):

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);
  }

}

Это частично основано на моем вопросе здесь: https://gamedev.stackexchange.com/questions/56475/how-to-simulate-feather-fall-in-box2d

И вы можете получить полный код и APK, чтобы попробовать его здесь .

1 голос
/ 10 сентября 2012

Использование этого кода частиц в моей игре для создания снега.Моя игра использует камеру 800x480.

    final RectangleParticleEmitter particleEmitter = new RectangleParticleEmitter(184.0f,44.0f,340,60);
    final ParticleSystem particleSystem = new ParticleSystem(particleEmitter, 100, 200, 360, this.mParticleTextureRegion);


    particleSystem.addParticleInitializer(new ColorInitializer(1, 1, 1));
    particleSystem.addParticleInitializer(new AlphaInitializer(0));
    particleSystem.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
    particleSystem.addParticleInitializer(new VelocityInitializer(-200, 200, -200, 200));
    particleSystem.addParticleInitializer(new RotationInitializer(0.0f, 360.0f));

    particleSystem.addParticleModifier(new ScaleModifier(1.0f, 1.2f, 0, 5));
    particleSystem.addParticleModifier(new ColorModifier(1, 0.98f, 1, 0.96f, 1, 0.82f, 0, 3));
    particleSystem.addParticleModifier(new ColorModifier(1, 1, 0.5f, 1, 0, 1, 4, 6));
    particleSystem.addParticleModifier(new org.anddev.andengine.entity.particle.modifier.AlphaModifier(0, 1, 0, 1));
    particleSystem.addParticleModifier(new org.anddev.andengine.entity.particle.modifier.AlphaModifier(1, 0, 5, 6));
    particleSystem.addParticleModifier(new ExpireModifier(3, 6));
1 голос
/ 06 января 2012
public Scene onLoadScene() {
Random randomGenerator = new Random();
pX = randomGenerator.nextInt(CAMERA_WIDTH);
Sprite snow = new Sprite (pX, 1, 30, 30, mTextureSnowRegion);
scene.getLastChild().attachChild(snow);
return scene;

Это выглядит хорошо. Вам просто нужно добавить MoveYModifer вместо MoveModifier.

А также вы должны использовать GenericPool в AndEngine, потому что он использует много памяти, чтобы продолжать создавать новые экземпляры Sprite и присоединять его. Также не забудьте отсоединить его, когда спрайт исчезнет с экрана.

Проверьте это

...