Вот видео проекта в его текущем состоянии.
Система частиц нуждается в эмиттере. Эмиттером может быть любая 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Нижней строчки нет - это блог глючит. :( Грузим текстуру для системы частиц. Вообще, если кто не в курсе, система частиц - это множество одинаковых маленьких спрайтов. Сколько конкретно их генерировать - прописано при создании системы частиц. Числа 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 секунд альфа спрайта меняется от изначального значения до полного нуля.(-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...> }
Комментариев нет:
Отправить комментарий