2012-01-06 20 views
3

我有這樣的代碼:如何在AndEngine中創建落雪?

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,但沒有任何工作。 請幫忙。

+0

http://code.google.com/p/android-30days-apps/source/browse/trunk/08day/src/com/bakhtiyor/android/snowfall/SnowFall.java?spec=svn27&r=27 This鏈接可能對您有所幫助 – 2012-01-06 13:21:01

+0

您應該接受有關粒子系統的答案之一,因爲這可能是在AndEngine中創建積雪的最佳方式。 – sm4 2013-05-24 01:09:33

回答

1
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。

而且你也應該在AndEngine中使用一個GenericPool,因爲它使用大量的內存來創建新的Sprite實例並附加它。當精靈離開屏幕時也不要忘記分離它。

看看這個

0

至於說chrypthic,你應該使用粒子系統具有良好的性能比較,因爲它已經有自己的游泳池系統。

我用它在我的應用程序(view in Android Market),它的工作原理非常完美。

1

在我的遊戲中使用此粒子代碼來創建雪。我的遊戲使用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

我正在使用類似的粒子系統settins作爲@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試用它here