Новости

Bomberman v1.2: додана анімація вибуху

Реалізував анімацію вибуху. Виявилося все досить-таки непросто. Обійтися одним об'єктом не виходило ніяк. Та й ще складність була в тому, що анімація вибуху по краях і в центрі різна. Але, про все по порядку.

По-перше, зробити все одним об'єктом можна, бо у мене об'єкти прямокутної форми, а тут потрібно хрестоподібний об'єкт реалізувати. У підсумку зробив клас Boom для вибуху, який містить масив частин вибуху = D

public class Boom {TimerTask task; Timer timer; Array <BoomPart> boomParts = new Array <BoomPart> (); ... public Boom (Array <BoomPart> boomParts) {this.boomParts = boomParts; name = "Boom"; state = State.NONE; createTimer (); } // вибух живе всього 0.5 секунд // після цього міняємо статус на BOOM ... // тоді при наступному рендеринге ми цей об'єкт видаляємо private void createTimer () {task = new TimerTask () {public void run () {state = State.BOOM;}}; timer = new Timer (); timer.schedule (task, 500); }

Ну, ясно все. Клас по суті є лише контейнером, цей об'єкт ніколи не промальовується, Рендер його частини:

public class BoomPart {public static float SIZE = 1f; protected Vector2 position = new Vector2 (); protected Rectangle bounds = new Rectangle (); // думаю, типи очевидні) public static enum Type {MIDDLE, UP, DOWN, LEFT, RIGHT, HORIZONTAL, VERTICAL} Type type; // поточний фрейм public float animationState = 0; public BoomPart (Vector2 pos, Type type) {this.position = pos; this.bounds.width = SIZE; this.bounds.height = SIZE; this.type = type; } // залежно від типу частині вибирається початковий фрейм для відтворення private void changeAnimationFrame () {switch (type) {case MIDDLE: animationState = Boom.SPEED * 16; break; case HORIZONTAL: animationState = Boom.SPEED * 20; break; ...}} // метод викликається при рендеринге // тут ми повертаємо який кадр треба отрисовать з спрайту public float getAnimationState () {animationState + = Gdx.graphics.getDeltaTime (); return animationState; } Public void setType (Type type) {this.type = type; changeAnimationFrame (); } Public Vector2 getPosition () {return position; } Public Rectangle getBounds () {return bounds; }}

Ну а при рендеринге отрісовиваємих потрібний кадр з Animation, про який можна прочитати в минулому статті .

private void drawBooms () {for (Boom boom: world.getBooms ()) for (BoomPart boomPart: boom.getParts ()) spriteBatch.draw (animations.get (Boom.Name) .getKeyFrame (boomPart.getAnimationState (), true ), (boomPart.getPosition (). x - cam.position.x + CAMERA_WIDTH / 2) * ppuX, boomPart.getPosition (). y * ppuY, BoomPart.SIZE * ppuX, BoomPart.SIZE * ppuY); }

Якщо хтось хоче допомогти з тестуванням, можете скачати Bomberman v1.2 .

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: