Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ColorMatrixFilter и классы (http://www.flasher.ru/forum/showthread.php?t=175332)

RhPlus 14.02.2012 23:43

ColorMatrixFilter и классы
 
День добрый
Пытаюсь применить к mc1:
Код AS3:

public class Main extends MovieClip 
        {
                public function Main():void
                {
                        var myFilter:satFilter = new satFilter();
                        mc1.filters = [myFilter];
                }
        }

фильтр, описанный классом:
Код AS3:

public class satFilter extends MovieClip
        {
 
                public function satFilter():void //constructor
                {
                        var disvolve:Number = 0.5;
                        var invert:Number  = (1 - disvolve);
 
                        var invRed:Number  = invert * 0.21267;
                        var invGreen:Number = invert * 0.71516;
                        var invBlue:Number  = invert * 0.07217;
 
                        var starkMatrix:Array = new Array();
                                                starkMatrix = starkMatrix.concat([(invRed+disvolve), invGreen, invBlue, 0, 0,]);
                                                starkMatrix = starkMatrix.concat([invRed, (invGreen+disvolve), invBlue, 0, 0,]);
                                                starkMatrix = starkMatrix.concat([invRed, invGreen, (invBlue+disvolve), 0, 0,]);
                                                starkMatrix = starkMatrix.concat([0, 0, 0, 1, 0]);
 
                        var filter:ColorMatrixFilter = new ColorMatrixFilter(starkMatrix);
                }
        }

Получаю следующие ошибки:
1)1067: Неявное приведение значения типа satFilter к несоответствующему типу Class.
2)1188: Wu6Я_Illegal assignment to class satFilter.

Подозреваю что либо класс фильтра возвращает не то что нужно, либо в основном классе я обращаюсь не к тому, к чему надо. Сам код фильтра рабочий, в одном основном классе все работало замечательно. Буду крайне признателен за помощь.

MikroAcse 14.02.2012 23:52

Код AS3:

var myFilter:satFilter = new satFilter();
mc1.filters = [myFilter];

Эх....
Что же с вами поделать?
satFilter возвращает самого себя.
А фильтр может быть только GlowFilter,ColorMatrixFilter и т.д.

Попробуй так:
Код AS3:

public class satFilter extends MovieClip
        {
 
                public function satFilter():void //constructor
                {
 
                }
                      public static function getFilter():ColorMatrixFilter{
                                var disvolve:Number = 0.5;
                        var invert:Number  = (1 - disvolve);
 
                        var invRed:Number  = invert * 0.21267;
                        var invGreen:Number = invert * 0.71516;
                        var invBlue:Number  = invert * 0.07217;
 
                        var starkMatrix:Array = new Array();
                                                starkMatrix = starkMatrix.concat([(invRed+disvolve), invGreen, invBlue, 0, 0,]);
                                                starkMatrix = starkMatrix.concat([invRed, (invGreen+disvolve), invBlue, 0, 0,]);
                                                starkMatrix = starkMatrix.concat([invRed, invGreen, (invBlue+disvolve), 0, 0,]);
                                                starkMatrix = starkMatrix.concat([0, 0, 0, 1, 0]);
 
                        var filter:ColorMatrixFilter = new ColorMatrixFilter(starkMatrix);
                                return filter;
                      }
        }

А вызывать так:
Код AS3:

public class Main extends MovieClip 
        {
                public function Main():void
                {
                        var myFilter:satFilter = new satFilter();
                        mc1.filters = [myFilter.getFilter()];
                }
        }

Или:
Код AS3:

public class Main extends MovieClip 
        {
                public function Main():void
                {
                        mc1.filters = [satFilter.getFilter()];
                }
        }

Думаю, работать будет.
Отпишись.

RhPlus 15.02.2012 00:49

При первом способе вызова ловлю ошибку:
"1061: Обращение к возможно неопределенному методу getFilter через ссылку статического типа satFilter"
При втором - все работает.

Соответственно, первый вопрос: почему когда я создаю экземпляр класса satFilter под названием myFilter и через него обращаюсь к функции getFilter возникает такая ошибка, а при прямом обращении к классу - нет?

Еще два вопроса:

2)Вы оставили пустым конструктор класса satFilter, тем не менее все работает, однако если проинициализировать в нем же функцию getFilter() (что как я думал раньше обязательно) все работает аналогично, почему тем не менее getFilter() инициализируется даже при пустом конструкторе?

3)Вы добавили атрибут "static" в заголовок функции getFilter(), если его убрать, возникает ошибка 1061: Обращение к возможно неопределенному методу getFilter через ссылку статического типа Class. Как работает функция (про static-переменные понятие я имею) с атрибутом "static"?
Большое спасибо за помощь.

MikroAcse 15.02.2012 01:02

Цитата:

При первом способе вызова ловлю ошибку:
"1061: Обращение к возможно неопределенному методу getFilter через ссылку статического типа satFilter"
Если вам нравится первый способ, сделайте так:
Код AS3:

public class satFilter extends MovieClip
        {
 
                public function satFilter():void //constructor
                {
 
                }
                      public function getFilter():ColorMatrixFilter{
                                var disvolve:Number = 0.5;
                        var invert:Number  = (1 - disvolve);
 
                        var invRed:Number  = invert * 0.21267;
                        var invGreen:Number = invert * 0.71516;
                        var invBlue:Number  = invert * 0.07217;
 
                        var starkMatrix:Array = new Array();
                                                starkMatrix = starkMatrix.concat([(invRed+disvolve), invGreen, invBlue, 0, 0,]);
                                                starkMatrix = starkMatrix.concat([invRed, (invGreen+disvolve), invBlue, 0, 0,]);
                                                starkMatrix = starkMatrix.concat([invRed, invGreen, (invBlue+disvolve), 0, 0,]);
                                                starkMatrix = starkMatrix.concat([0, 0, 0, 1, 0]);
 
                        var filter:ColorMatrixFilter = new ColorMatrixFilter(starkMatrix);
                                return filter;
                      }
        }

И вызывать:
Код AS3:

public class Main extends MovieClip 
        {
                public function Main():void
                {
                        var myFilter:satFilter = new satFilter();
                        mc1.filters = [myFilter.getFilter()];
                }
}


Цитата:

3)Вы добавили атрибут "static" в заголовок функции getFilter(), если его убрать, возникает ошибка 1061: Обращение к возможно неопределенному методу getFilter через ссылку статического типа Class. Как работает функция (про static-переменные понятие я имею) с атрибутом "static"?
http://www.flasher.ru/forum/showthread.php?t=125858

Цитата:

2)Вы оставили пустым конструктор класса satFilter, тем не менее все работает, однако если проинициализировать в нем же функцию getFilter() (что как я думал раньше обязательно) все работает аналогично, почему тем не менее getFilter() инициализируется даже при пустом конструкторе?
Хм...
Потому что это отдельная функция :)
Не знаю как точнее объяснить.

Цитата:

Соответственно, первый вопрос: почему когда я создаю экземпляр класса satFilter под названием myFilter и через него обращаюсь к функции getFilter возникает такая ошибка, а при прямом обращении к классу - нет?
Потому что satFilter - статическая функция, и вызывается без создания экземпляра класса.

RhPlus 15.02.2012 01:06

Еще раз спасибо, проблема решена.


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

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