ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение XELAD »

Может ли экземпляр класса "поймать" изменение static var?
Цитата из O.Reilly AS3 CookBook:
There are cases in which you want the property or method to be associated with the class itself rather than with instances of the class. That means that no matter how many instances of the class there may be, there is just one property or method. Such properties and methods are called static properties and methods.
Предположим, у нас куча экземпляров класса. В самом классе есть один static var, который мы захотим изменить извне. При этом экземпляры должны на это среагировать.
Схема: записать все экземпляры в массив и пройтись по нему - нежелательна.
Если мы напишем (в package в наш класс) (соединив примеры из той же книги)

Код: Выделить всё

static private var XZ:Number = 0;static public function set XZCHTO(value:Number){ XZ = XZCHTO; SomeF();}private function SomeF(){ }
То увидим, что static function не "видит" функций, относящихся к экземплярам класса... Но должен же быть какой-то способ.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение Casperovskii »

XELAD
Если я ничего не путаю, то static var - это значение уже для всех экземпляров класса. Т.е. изменив статическую переменную, все экземпляры сразу на это отрегаируют и не нужно для каждого менять отдельно.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение XELAD »

Casperovskii писал(а):XELAD
изменив статическую переменную, все экземпляры сразу на это отреагируют и не нужно для каждого менять отдельно.
Это всё верно, разница лишь в том, что я хочу, чтобы выполнилась определенная функция у каждого экземпляра класса, как только эта статическая переменная будет изменена. Другими словами, функция изменения статической переменной - статична, для всех экземпляров одна; а функция, которая должна выполниться у экземпляра - она private, для всех экземпляров разная. Если не получается разослать всем экземплярам класса событие об изменении static var, потому что static не "видит" private (выводит ошибку), то... Нужно из экземпляра класса как-то выцепить отклик на изменение static var.
Предположим, у нас на stage тысяча экземпляров SomeClass, который extends Sprite. В этом SomeClass есть static public var Special_X , особое смещение по X для всех экземпляров класса. Тут мы из основного кода вызываем

Код: Выделить всё

SomeClass.Special_X = 10;
и все экземпляры должны отреагировать, сместившись по Х.[/color]
В классе SomeClass пишем.....? Как уловить это изменение статической переменной для каждого экземпляра? Если Special_X сменилась, сделать то-то.
То,что я описывал выше, это мои пробы, получилось лишь зафиксировать момент изменения статической переменной в самом классе.
Проходить по всем экземплярам класса (записать в массив их всех) и сообщать им,что переменная изменилась?
Приделать к каждому экземпляру по listener ENTER_FRAME, и там прописать реакцию на изменение статической переменной?
Все эти задумки выглядят кривым велосипедом.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение Casperovskii »

XELAD
Инструкция static. Т.к. каждый экземпляр должен сделать свое действие (функция же не статична?), то нужно именно записывать в массив и вызывать необходимое действие. Если функция статична и одинакова для всех экземляров класса, то можно в случае изменения статичной переменной вызвать её так:

Код: Выделить всё

SomeClass.MyStaticFunction();
Инструкцию super или ключевое слово this нельзя использовать внутри статического метода.
Только я не уверен, что статичная функция может работать с нестатичными переменными, а с приведенной цитатой уж точно уверен, что нельзя. Т.е. если у нас есть переменные Special_X и просто X, то написать статичную функцию:

Код: Выделить всё

MyStaticFunction():void {   x = x + 2; //обращение к нестатичной переменной, то бишь к переменной класса - аналогично this.x = this.x + 2;}
Скорее всего, нельзя. Пробуй. Иначе - только то, что ты назвал "кривым велосипедом".

Насчет listener на ENTER_FRAME - зачем? Создай свое событие и все. И просто при каждом создании объекта вешай listener на твое событие. А с ENTER_FRAME при тысяче экземпляров ты будешь выполнять 24килофункции в секунду (при FPS 24, ессесно), оно тебе надо?
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение XELAD »

Casperovskii
Записал все экземпляры в static массив, назначил функцию на изменение static public var Special_X, в ней прописал проход по этому массиву. Интересно то, что ссылку на private function пришлось получать не через экземпляр, а через this.

Код: Выделить всё

package  {    import flash.display.MovieClip;    public class XZ extends MovieClip    {        static private var Instances:Array = new Array();        public function XZ()         {            Instances.push(this);        }        static public function set Special_X(v:Number)        {            for(var i in arr_DISPLAY_OBJECTS)            {                arr_DISPLAY_OBJECTS[i].SomePrivateFunc();            }        }        private function SomePrivateFunc()        {            //DO SMTH        }    }}
А в документе:

Код: Выделить всё

import XZ;XZ.Special_X = 10;
В результате: при изменении статической переменной класса, будет вызвана статическая функция, которая пройдется по массиву всех экземпляров, и выполнит их private function.
P.S. В примере возможны ошибки.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение Casperovskii »

XELAD
Все правмльно. Private function - метод экземляра, а static function - метод всего класса. Поэтому и пришлось вызывать через экземпляр.
Рад, что сумел подтолкнуть к решению проблемы.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение XELAD »

Здравствуйте.
Использую AS3. Пытаюсь передать в функцию разное количество переменных. В результате все они записываются в одну array, но в этом не проблема.
Перечитывая статьи из интернета, и вот эту http://help.adobe.com/ru_RU/as3/dev/WS5 ... -7fde.html, узнаю, что превратить потом эти переменные в var возможно лишь используя this.
Впрочем, обо всём по порядку:

Код: Выделить всё

someFunc(1, "A");someFunc(2, "B", 4);someFunc(3, "C", 18, SomeClass);
...ставит перед разработчиком интересную задачу, так как конструктор должен принимать список аргументов любой длины. ...Единственный оставшийся вариант — воссоздать логику конструктора Array ... В приведенном ниже коде показан алгоритм, используемый в конструкторе класса Array...

Код: Выделить всё

function someFunc(...args){  var n:uint = args.length;   for (var i:int=0; i < n; i++)   {       this[i] = args[i];     }   }
Как видим, вместо написания
var VarName = args;
используется
this = args;

У меня не получилось каким-либо способом заставить функцию создавать временные vars. То есть, на сколько я понимаю, this это присваивание private переменной, которая так и останется в памяти, пока есть класс. И это не дело, если у меня много функции и vars иногда называются одинаково для разных функций. Так что же, писать отдельный блок, ещё и в конце каждой функции, где будет
delete this;
?
Наверно, это не столь Простой вопрос) Буду благодарен за помощь.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение XELAD »

Вся эта проблема возникла, когда я пытался создать отложенное выполнение функций.
К примеру: откуда-то вызывается функция, с десятком параметров, однако её не нужно выполнять до тех пор, пока объект, на который она направлена, не станет виден в пределах экрана. Пытаюсь сделать следующее: все пользовательские функции записываются в массив, где [0] - это отложенная функция, [1] - это параметры. Тут то и оказывается, что я эти параметры объединяю в Array, и при передаче этого массива указанной отложенной функции, Array становится одним единственным параметром. Его придётся разбить на vars... или
покопавшись в справке, нашел

Код: Выделить всё

Function.apply(toWhom, arrayParams);
Видимо это - то,что мне и нужно было. (Просто не знал о существовании такого метода).
__________
Да, выполняется всё как нужно: Array превращается во временные vars, а в самих пользовательских функциях ничего переделывать не нужно. :D
Аватара пользователя
Ugly
Сообщения: 16
Зарегистрирован: 13 янв 2013, 11:03

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение Ugly »

Здравствуйте. Вопрос, должно быть, простецкий, но ответа на него не нашел. Заключается он в следующем:
Представим, что у нас есть over99999 каких-нибудь кнопок (ну, скажем, какие-нибудь клетки в пошаговой игре, или игровой магазин с множеством мелких вещей). И, к примеру, при нажатии на любую из них должно случиться что-то именно с этой кнопкой/клеткой/т.п. Не могу же я ставить своего слушателя на каждую из этих over99999 кнопок - быстродействие упадет... Или могу? :? Вообще выглядит некрасиво по-моему очень. Можно ли как-то обойтись объявлением одного слушателя (к примеру, все эти кнопки - дети одного класса), или может быть есть еще какой-то путь?
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: ПРОСТОЙ ВОПРОС - ОТВЕТ (только Flash)

Сообщение Alazaur »

over99999 слушателей и один обработчик.
Ответить