Форум 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=214728)

Appleman 13.11.2017 17:19

Подмигнуть :)
 
Друзья, столкнулся с такой проблемой. На экране размещаются иконки - экземпляры Sprite. Для них планируется несколько простых эффектов. Например, при определённых событиях модели, иконка должна уметь "подмигнуть" - изменить свой размер один или несколько раз, чтобы привлечь внимание пользователя. Загвоздка в том, что каждая иконка - это отдельный класс, а эффекты для них одни и те же. Писать один и тот же метод в каждый класс - явно не дело.

Сделал "статический" класс с нужным мне методом:

Код AS3:

public class VisualEffects extends Sprite
        {
                private static var _component:Sprite;
                private static var _times: uint;
 
                private static var _originalScale:uint = 1;
                private static var _blinkingScale:Number;
                private static var _nextScale:Number;
 
                public static function blink(component: Sprite, scaling: Number, times: uint): void
                {
                        var blinkTimer:Timer = new Timer(100, times);
                        _component = component;
                        _times = times;
                        _blinkingScale = _originalScale + scaling;
                        _nextScale = _blinkingScale;
                        blinkTimer.addEventListener(TimerEvent.TIMER, VisualEffects.changeSize);
                        blinkTimer.start();
                }
 
                private static function changeSize(event:TimerEvent) : void
                {
                        _component.scaleX = _nextScale;
                        _component.scaleY = _nextScale;
                        _component.scaleZ = _nextScale;
                        if (_nextScale == _blinkingScale) _nextScale = _originalScale;
                        else _nextScale = _blinkingScale;
                }
 
                public function VisualEffects() {}
        }

Запускается без ошибок, но при запуске на экране начинается фигня с появлением разноцветных полос :) В общем, не работает как надо. Что я делаю не так?

И ещё прикладной вопрос вдогонку. Если у нас таймер с фиксированным количеством повторений, нужно ли явно убирать слушатель его событий? И если да, то в каком месте кода?

illuzor 13.11.2017 17:26

Цитата:

Писать один и тот же метод в каждый класс - явно не дело.
А для чего наследование придумали?

Эти статические методы будут работать только с одним спрайтом. Если нужно замигать сразу несколько, всё сломается.

Цитата:

Если у нас таймер с фиксированным количеством повторений, нужно ли явно убирать слушатель его событий?
Да.
Цитата:

И если да, то в каком месте кода?
По событию TIMER_COMPLETE.

Appleman 13.11.2017 17:28

Цитата:

Сообщение от illuzor (Сообщение 1202917)
А для чего наследование придумали?

О, блин, и правда. Ларчик просто открывался. Спасибо :)
Про TIMER_COMPLETE тоже понял, спасибо.

ZergMaster 13.11.2017 17:29

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

undefined 13.11.2017 17:56

если нет работы с 3d трансформациями, свойство scaleZ трогать ни к чему.Возможно отсюда и непонятные полосы.

Appleman 14.11.2017 14:13

Спасибо, undefined, всё верно, именно из-за него! Я уже и сам догадался. Всё-таки 15-летний стаж 3D-шника даёт о себе знать. Как-то без z-координаты непривычно тут во флешах :)

caseyryan 14.11.2017 15:18

Офтоп, но
Цитата:

Сообщение от Appleman (Сообщение 1202933)
Всё-таки 15-летний стаж 3D-шника даёт о себе знать. Как-то без z-координаты непривычно тут во флешах :)

Как-то немножко не вяжется с
Цитата:

Цитата:

А для чего наследование придумали?
О, блин, и правда. Ларчик просто открывался. Спасибо
Про TIMER_COMPLETE тоже понял, спасибо.

undefined 14.11.2017 15:20

3d необязательно программирование

caseyryan 14.11.2017 15:21

Цитата:

Сообщение от undefined (Сообщение 1202938)
3d необязательно программирование

Ну тут, как бы тема о программировании. Поэтому мне такая мысль и пришла)

Appleman 20.11.2017 18:18

Подскажите ещё, плиз. Сделал в итоге потребный алгоритм мигания иконок через изменение их размеров по таймеру, даже с некоторым ускорением для пущей красоты анимации. Вот кусочек кода с принципиальным моментом:

Код AS3:

public function blink(times: uint): void
                {
                        _totalTimes = times;
                        _blinkTimer = new Timer(30);
                        _blinkTimer.addEventListener(TimerEvent.TIMER, changeSize);
                        _blinkTimer.start();
 
                }
 
                private function changeSize(event:TimerEvent) : void
                {
                        //кусок кода пропущен
                        else if (_increasingPhase == true)
                        {
                                if (_totalResize <= MAX_PIXELS_SCALED)
                                        {
                                                _totalResize += (_oneFrameInsrease + _speedUp);
                                                this.width += (_oneFrameInsrease + _speedUp);
                                                this.height += (_oneFrameInsrease + _speedUp);
                                                _speedUp += _speedUp;
                                        }
                                else _increasingPhase = false;
                        }

Изменение размеров реализовано через this.width и this.heigth. Проблема такая. Когда я делаю просто иконку для теста, она прекрасно "подмигивает", корректно изменяя свой размер. Но вот при встраивании объекта-иконки "в боевом режиме" она изменяет свой размер не относительно собственного цента, а относительно другой точки, судя по всему, нулевой координаты родительского объекта, хотя последнее я не проверял. В общем, они прыгают вверх-вниз, наискосок и как угодно. Как исправлять? Спасибо.


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

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