пятница, 9 ноября 2012 г.

Система частиц. Добавим огненный след от двигателя.


Вот видео проекта в его текущем состоянии.


Система частиц нуждается в эмиттере. Эмиттером может быть любая Entity, и любой подкласс Entity. В моем случае эмиттером будет класс Hero. Для этого допишем в объявление класса "implements IParticleEmitter". Нам так же понадобится прописать соответствующий метод getPositionOffset, унаследованный от интерфейса. Этот метод отвечает за перемещение центра фигуры, испускающей частицы. Фигура может быть разной, в движке несколько разновидностей. Но мы используем самую простую - точку. Ну а координаты этой точки будут жестко привязаны к координатам спрайта. И приходиться они будут на хвост нашего самолетика. Вот какие изменения произойдут в классе Hero:
class Hero extends Sprite implements GlobalConstants, IParticleEmitter{
<...some code...>
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
 public void getPositionOffset(float[] pOffset) {
  pOffset[VERTEX_INDEX_X] = this.sX + 13f;
  pOffset[VERTEX_INDEX_Y] = this.sY + 40f; 
 }
<...some code...>
}
Теперь добавим саму систему частиц. Пока она у нас будет в общем сраче в основном файле MainActivity. Вот какой код добавлен у меня в данном конкретном случае.
public class MainActivity extends SimpleBaseGameActivity implements 
SensorEventListener, GlobalConstants{
<...some code...>
private BitmapTextureAtlas mParticlesTexture;
private ITextureRegion mParticlesTextureRegion;
private SpriteParticleSystem mPS;
<...some code...>
protected void onCreateResources(){
<...some code...>
 this.mParticlesTexture = new BitmapTextureAtlas
            (this.getTextureManager(), 32, 32);
 this.mParticlesTextureRegion = 
            BitmapTextureAtlasTextureRegionFactory.createFromAsset
            (this.mParticlesTexture, this, "particle1.png",0,0);
 this.mParticlesTexture.load();
}
protected Scene onCreateScene()  {
<...some code...>
  scene.attachChild(hero);
  mPS = new SpriteParticleSystem(hero, 50, 100, 110, this.mParticlesTextureRegion ,
        this.getVertexBufferObjectManager());
  mPS.addParticleInitializer(new VelocityParticleInitializer(-20.0f, 20.0f, 200.0f, 300.0f));
  mPS.addParticleInitializer(new ExpireParticleInitializer(0.3f, 0.8f));
  mPS.addParticleInitializer(new BlendFunctionParticleInitializer(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE));
  mPS.addParticleModifier(new ColorParticleModifier(0.0f, 0.3f, 1.0f, 1.0f, 0.7f, 0.0f, 0.0f, 0.0f));
  mPS.addParticleModifier(new OffCameraExpireParticleModifier(this.sapCamera));
  mPS.addParticleModifier(new ScaleParticleModifier(0.0f, 0.3f, 1.0f, 0.1f, 1.0f, 1.0f));
  mPS.addParticleModifier(new AlphaParticleModifier(0.3f, 0.8f, 1.0f, 0.0f));
  scene.attachChild(mPS);
<...some code...>
}
<...some code...>
}
Нижней строчки нет - это блог глючит. :( Грузим текстуру для системы частиц. Вообще, если кто не в курсе, система частиц - это множество одинаковых маленьких спрайтов. Сколько конкретно их генерировать - прописано при создании системы частиц. Числа 50, 100, 110 обозначают, что частиц генерируется от 50 до 100 штук в секунду, но при этом их общее количество не может быть больше 110. Дальше применяем к системе частиц различные модификаторы. Строчка 22 - модификатор скорости. Скорость по Y от -20 (20 единиц влево) до +20 (20 единиц вправо). И по Х от 200 до 300 вниз. Строчка 23 - модификатор времени жизни частиц. Каждая частица будет жить от 0.3 до 0.8 секунд. Строчка 24 - модификатор наложения. Вообще очень жаль, что в AndEngine нет Additive Blending. По поводу наложения - это отдельная долгая тема. Пока надо просто применять те параметры, которые я указал. Строчка 25 - модификатор цвета. Вот что значат параметры (в порядке их следования): Начало модификации в 0 (момент рождения), конец модификации в 0.3 секунды. В начале значение красного равно 1, в конце тоже, в начале модификации значение зеленого равно 0.7, в конце 0, последние 2 цифры для синего - и в начале и в конце он равен нулю. По цвету есть важное замечание - желательно, чтобы спрайт частицы содержал только белый цвет и разнообразную альфу. Хотя использовать любые другие не воспрещается. Строчка 26 - модификатор удаления частиц, улетевших за пределы экрана (для производительности). Строчка 27 - Модификатор сжатия\растяжения. В данном случае в промежутке от 0 до 0.3 секунд размер по Х уменьшается от 1 до 0.1, размер по У не меняется. Строчка 28 - модификатор альфы. В промежутке от 0.3 до 0.8 секунд альфа спрайта меняется от изначального значения до полного нуля.

Комментариев нет:

Отправить комментарий