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

tattori 12.07.2015 00:22

вопрос по статическим методам и слушателям событий
 
есть такая статическая функция в классе
Код AS1/AS2:

public static function addMovie()
                {
                Zona.addEventListener(MouseEvent.MOUSE_DOWN, downL);       
                }

обращение несуществующего свойства Zona, выдает такую ошибку, заметил что слушатели выдают ошибки если они в статических функциях, в чем тут дело объясните никак не разберусь

Zebestov 12.07.2015 03:20

Слушатель можно повесить лишь на экземпляр(!) наследника EventDispatcher. Значит на класс нельзя повесить слушатель никогда. Если таки очень надо вот так абстрагироваться, заводи синглтон (там есть пример реализации на AS3).

tattori 12.07.2015 13:39

не понял, почему на простую функцию вешаешь слушатель и работает нормально , а на статической не хочет?

undefined 12.07.2015 13:55

Возможно объект Zona еще не создан к моменту вызова статического метода.Собственно об этом и говорит RTE.
Да и почитайте про as3 naming conventions.Имена объектов принято писать с маленькой буквы, классов - с большой

udaaff 12.07.2015 13:59

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

Zebestov 12.07.2015 14:57

Цитата:

Сообщение от tattori (Сообщение 1184801)
не понял, почему на простую функцию вешаешь слушатель и работает нормально

На функцию? Это еще как?!

tattori 12.07.2015 15:04

Цитата:

Возможно объект Zona еще не создан к моменту вызова статического метода.Собственно об этом и говорит RTE.
он создан
Цитата:

Да и почитайте про as3 naming conventions.Имена объектов принято писать с маленькой буквы, классов - с большой
я пробовал менять название

Zebestov 12.07.2015 15:07

Тю! Так Zona — это объект?!
Ок. А объект этот — он экземпляр какого класса? Если этот класс свой, то от чего он наследуется?

tattori 12.07.2015 15:21

Цитата:

Тю! Так Zona — это объект?!
Ок. А объект этот — он экземпляр какого класса? Если этот класс свой, то от чего он наследуется?
вот класс объекта
Код AS3:

package  {
 
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
 
        public class Level extends MovieClip
        {
 
 
                public function Level()
                {
 
                }// Конструктор
 
                private function downL(event:MouseEvent):void
                {
                        gotoAndStop(2);
                }
 
                public static function addMovie()
                {
                        Zona.addEventListener(MouseEvent.MOUSE_DOWN, downL);
                }
 
        }
}

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

Zebestov 12.07.2015 15:23

Я спрашивал про Zona — где оно определяется, где оно создается?

tattori 12.07.2015 15:25

Zona создана вручную внутри Level

Zebestov 12.07.2015 15:26

Где, покажи код, где она создается!

tattori 12.07.2015 15:27

Zona создана вручную внутри level

Добавлено через 1 минуту
я же говорю вручную , перетащил из библиотеки на сцену внутри Level

Zebestov 12.07.2015 15:28

Ты имеешь в виду в IDE? Это не картинка случайно?

tattori 12.07.2015 15:31

в adobe flash , нет это мувиклип
Код AS3:

public function addMovie()
                {
                        Zona.addEventListener(MouseEvent.MOUSE_DOWN, downL);
                }

так все работает
Код AS3:

public static function addMovie()
                {
                        Zona.addEventListener(MouseEvent.MOUSE_DOWN, downL);
                }

а так не хочет

udaaff 12.07.2015 15:38

Вы не можете из статического метода обращаться к свойствам экземпляра.

Zebestov 12.07.2015 15:38

Ах ты ж блин :) ну конечно не будет! Статические методы имеют доступ только к статическим же свойствам. Нет никакого статического "Zone" в нативном классе MovieClip.

ZackMercury 12.07.2015 15:40

А вы вообще в курсе, что такое статический метод?

udaaff 12.07.2015 15:41

Цитата:

но так как на сцене много экземпляров Level то хотел вызвать один метод и что бы слушатели были у всех
Вам надо или вешать один слушатель на родительский контейнер и ловить событие нажатия на фазе всплытия. Или в цикле задавать слушатель для каждого объекта в отдельности.

tattori 12.07.2015 15:41

Цитата:

Сообщение от udaaff (Сообщение 1184838)
Вы не можете из статического метода обращаться к свойствам экземпляра.

то есть если на сцене 100 экземпляров Level и мне надо у всех включить слушатель на клик мне по любому надо сделать метод не статичным и циклом вызвать addMovie у каждого экземпляра?

Добавлено через 1 минуту
Цитата:

Сообщение от ZackMercury (Сообщение 1184840)
А вы вообще в курсе, что такое статический метод?

это единый метод для всех экземпляров

ZackMercury 12.07.2015 15:45

Вот так можно

Код AS3:

for(var i:int = 0; i < numChildren; i ++)
{
  if(getChildAt(i) is Level)) getChildAt(i).addEventListener(MouseEvent.CLICK, levelClicked);
}

Добавлено через 3 минуты
PHP код:

это единый метод для всех экземпляров 

Где вы это вычитали?

Он не имеет вообще ничего общего с экземплярами, скажу вам по честнаку.

tattori 12.07.2015 15:57

Цитата:

Сообщение от udaaff (Сообщение 1184841)
Вам надо или вешать один слушатель на родительский контейнер и ловить событие нажатия на фазе всплытия. Или в цикле задавать слушатель для каждого объекта в отдельности.

спасибо, грамотно помог

Zebestov 12.07.2015 16:10

Помог-то он грамотно. Другое дело, достаточно ли грамотна архитектура твоего проекта, чтобы применить эту помощь.

tattori 12.07.2015 17:33

Цитата:

Сообщение от Zebestov (Сообщение 1184850)
Помог-то он грамотно. Другое дело, достаточно ли грамотна архитектура твоего проекта, чтобы применить эту помощь.

не знаю грамотна или нет архитектура но применить это не составляет проблем, просто я хотел что бы в классе который вызывает addMovie было как можно меньше кода, точнее что бы просто было Level.addMovie, теперь придётся создать цикл, а я пытался максимально мало кода что бы было


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

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