Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   эффект отравления юнита (http://www.flasher.ru/forum/showthread.php?t=210194)

a7s1h1 06.02.2015 16:11

эффект отравления юнита
 
Здравствуйте!
Хочу сделать так, что при отравлении юнит становится зеленоватым. Когда отравление проходит - опять становится нормальным. Вот варианты, которые рассмотрел или попробовал:
1. Рисовать анимацию отдельно для отравленного состояния.
Почему не стал использовать: плохой вариант, увеличивает вдвое количество статусов у юнита в коде и количество анимаций в библиотеке

2. Менять цвет юнита.
Пробовал менять цвет так:
Код AS3:

ct:ColorTransform = new ColorTransform;
ct.color = 0x00FF00;
transform.colorTransform = ct;

Тот же код при "выздоровлении", но цвет меняется на белый.
Почему не получилось: цвета меняются у всего мувика, т.е. остаётся один силуэт заданного цвета. Установка белого цвета просто меняет цвет на белый, а не обнуляет раскрашивае (впрочем, это было ожидаемо)

3. Наложить маску.
При создании юнита (со свойством private var poisonMask:Shape) добавил
Код AS3:

// индикация отравления
_poisonMask = new Shape();
_poisonMask.graphics.beginFill(0x00FF00, .5);
_poisonMask.graphics.drawRect(0, 0, width, height);
_poisonMask.graphics.endFill;
_poisonMask.cacheAsBitmap = true;
mask = null // убираем маску

При отравлении:
Код AS3:

mask = _poisonMask; //применяем маску

Почему не получилось: При отравлении юнит вообще становится невидимым, а после "выздоровления" снова появляется. Чую, что вообще не правильно понимаю, что такое маска...

Подскажите, пожалуйста, как можно "слегка зеленить" юнита (с несколькими анимациями), и, соответственно, "снимать" эту зелень? Хотя бы намекните, при помощи какого инструмента это можно делать.

callme 06.02.2015 16:53

Используй greenMultiplier или greenOffset у ColorTransform.

faraday 06.02.2015 17:57

Можете посомтреть в сторону tweeLite. там это все легко делать через colorTransform . Ну а вообще не знаю чем вас смущает количество статусов. правильное решение - использовать автомат состояний. Иначе быстро запутаетесь . Ну и если типов юнитов много, надо подумать о правильном наследовании. Но это так, оффтопик

a7s1h1 06.02.2015 18:31

Цитата:

Сообщение от faraday (Сообщение 1178682)
Можете посомтреть в сторону tweeLite. там это все легко делать через colorTransform . Ну а вообще не знаю чем вас смущает количество статусов. правильное решение - использовать автомат состояний. Иначе быстро запутаетесь . Ну и если типов юнитов много, надо подумать о правильном наследовании. Но это так, оффтопик

Ради такого пустяка не хочется использовать твинер. А статусы у меня и так есть: от них зависит и поведение, и анимация. И количество статусов меня совершенно не смущает, чего не скажешь про количество анимаций: так как для каждого статуса своя анимация, то рисования отдельной анимации для каждого статуса, но в отравленном состоянии как раз увеличило бы количество анимаций вдвое. Зачем такие муки, если можно перекрасить программно, правильно?

Цитата:

Сообщение от callme (Сообщение 1178674)
Используй greenMultiplier или greenOffset у ColorTransform.

Спасибо большое, то, что надо! Вот, что получилось (может, кому пригодится):
Свойство юнита:
Код AS3:

private var _defaultColor:ColorTransform; // цвет по умолчанию

Теперь, чтобы озеленить юнита, пишу poisonColor(); чтобы снять озеленение - poisonColor(false).
А вот сам метод:
Код AS3:

/**
*
* Установка и отмена цвета отравления
*
* @param        green озеленять или нет, по умолчанию - да
*/

private function poisonColor(green:Boolean = true):void {
        if (green) {
                var newColorTransform:ColorTransform = transform.colorTransform; // отталкиваемся от цвета по умолчанию
                newColorTransform.color = 0x00FF00; // зелёный
                newColorTransform.greenMultiplier = 1; // зелёность зелёного цвета не меняется
                newColorTransform.greenOffset = .5; // прозрачность зелёного
                transform.colorTransform = newColorTransform; // применяем новый цвет
        } else {
                transform.colorTransform = _defaultColor;// возвращаем исходный цвет
        }
}

Метод не универсален, но для моих целей подходит вполне. Хотя предложения по чистоте и оптимизации кода приветствуются.

GBee 06.02.2015 19:28

А я использовал силиновский ColorAdjust. Соответственно для выздоровления - фильтр убираем.
http://silin.su/#AS3/filters/color

a7s1h1 06.02.2015 19:46

Цитата:

Сообщение от GBee (Сообщение 1178720)
А я использовал силиновский ColorAdjust. Соответственно для выздоровления - фильтр убираем.http://silin.su/#AS3/filters/color

да, на silin.su вообще очень много всего полезного, я тоже поначалу туда сунулся, но целый класс ради такого пустяка, как окраска юнита в конкретный момент в конкретный цвет, приплетать не хотелось


Часовой пояс GMT +4, время: 01:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.