Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.03.2010, 00:29
xjack вне форума Посмотреть профиль Отправить личное сообщение для xjack Найти все сообщения от xjack
  № 1  
Ответить с цитированием
xjack

Регистрация: Apr 2009
Сообщений: 104
По умолчанию Обработчик события и область видимости

Добрый день. Ситуация следующая - есть родительский класс-мувик, в нем несколько дочерних мувиков, на которые вешается обработчик события onEnterframe.
В этом обработчике необходимо обратиться к свойству мувика, который сгенерил событие (когда пишу просто this.anyField компилятор выдает ошибку что в классе Main нету такого свойства). Кроме того нужно обратиться и к методам класса Main тоже.
Ниже приведена примерная схема того что нужно. Если перенести код из класса в кадр главного мувика то все работает, а вот в классе даже и не знаю как сделать.

Код AS3:
  class Main extends MovieClip{
 
    var movies:Array;
 
    function Main(){
       for (var i = 0; i < 15; i++) {
        movies[i] = attachMovie("ChildMovie", "mc"+i, i);
        movies[i].speed = 20;
        movies[i]._x = 100+20*i;
        movies[i].finishX = 200+20*i;
       }
    }
 
    function Play(){
     for (var i = 0; i < 15; i++) 
     movies[i].onEnterFrame = Run;
    }
 
    function Run() {
      this.speed+=1; /*Здесь хотелось бы обратиться к свойствам соответствующего мувика*/
 
      if (this._x == this.finishX)
      Stop();  /*А здесь вызвать метод класса Main*/
    }
 
    function Stop(){
 
    }
 
  }


Последний раз редактировалось xjack; 13.03.2010 в 14:59.
Старый 13.03.2010, 13:20
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
movies == undefined, i==undefined. Сначала это поправьте . А если поправлено то выкладывайте код полностью, а не по куску

Добавлено через 2 минуты
Про anyfield. Если верно понял :
Код AS1/AS2:
 function Play(anyField){
    anyField.makeUEvent
}

Старый 13.03.2010, 17:28
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 3  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
В этом обработчике необходимо обратиться к свойству мувика, который сгенерил событие (когда пишу просто this.anyField компилятор выдает ошибку что в классе Main нету такого свойства). Кроме того нужно обратиться и к методам класса Main тоже.
В данном случае this указывает на один из мувиков, так как обработчик вызывается через этот мувик, но компилятор не в курсе этого, поэтому нужно в этом случае кастовать к типу мувика, содержащегося в массиве.
Но это не совсем верно, на мой взгляд, вызывать обработчик содержащийся в одном объекте в области видимости другого. Могу предложить такой вариант:
Код AS1/AS2:
import com.aditall.utils.Delegate;
 
class Main
{
 
	public function Main()
	{
		super();
 
		myObject = {};
		myObject.onMouseDown = Delegate.create(this, myObject_onMouseDownHandler, [ { target: myObject } ]);
		Mouse.addListener(myObject);
	}
 
	private var myObject;
 
	private function myObject_onMouseDownHandler(event:Object):Void
	{
		trace(event.target == myObject);
		trace(this instanceof Main);
	}
 
}
Класс делегата взял от сюда http://www.flasher.ru/forum/showthread.php?p=880125

Старый 13.03.2010, 23:49
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Удав ну ты перегнул палку ваще))) Все конечно красиво. Но супер конструктор то зачем?

Старый 14.03.2010, 00:17
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 5  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
Но супер конструктор то зачем?
Считается хорошим тоном всегда super() писать в конструкторе, хоть он там и неявно будет вызываться. Можно и не писать.

Старый 14.03.2010, 12:36
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Да ваще компилятор его сам поставит. Если считается хорошим тоном - то что он делает, ты вкурсе вообще?, точнее так : класс без супер конструктора и класс с супер - чем будут отличаться визуально , а так же просто при компиляции

Добавлено через 8 минут
Код AS1/AS2:
  class Main extends MovieClip{
 
    var movies:Array;
 
    function Main(){
       for (var i = 0; i < 15; i++) {
        movies[i] = attachMovie("ChildMovie", "mc"+i, i);
        movies[i].speed = 20;
        movies[i]._x = 100+20*i;
        movies[i].finishX = 200+20*i;
// чтобы видеть значения в следующей функции нужно испольховать делегат, в //твоем случае функция маин тока задает координаты и аттачит мувики, НО при //этом нету направления на продолжение скрипта. Должно быть приблиз так :
//- координаты и прочее ( например в цикле)
//- вызов функции с делегатом для сохранения параметров, или же вызов функции //через делегат inils для сохранения параметров, а так же передачи параметров //функции
       }
    }
 
    function Play(){
     for (var i = 0; i < 15; i++) 
     movies[i].onEnterFrame = Run;
// здесь ипользовалася бы только делегат inils 
//- movies[i].onEnterFrame = inils.Delegate.create(this,Run,[i]);
    }
 
    function Run(SUPER_I) {
     movies[SUPER_I]+=1; /*Здесь хотелось бы обратиться к свойствам соответствующего мувика*/
 
      if (this._x == this.finishX)
      this.Stop();  /*А здесь вызвать метод класса Main*/
// а если важны например параметры из этой функции, то можно либо делгатом //снова либо setInterval , он кстати тоже сохранит параметры.
    }
 
    function Stop(){
 
    }
 
  }

Старый 14.03.2010, 13:07
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 7  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Смысл в том, чтобы неявное показать явным. Т.е. это из разряда того, чтобы писать public перед методами класса/классом, или при создании экземпляра класса писать всегда круглые скобки, даже если не передаются параметры. Или же показывать явно, что метод не возвращает никакого результата.
Цитата:
Если считается хорошим тоном - то что он делает, ты вкурсе вообще?
В конструкторе super() вызывает суперконструктор. Мы обязаны были бы его написать, если бы было необходимо передать какие-то параметры в конструктор суперкласса, а так я просто показал, что он там вызывается. Для осознания того, для чего это делается, я привел несколько примеров выше.

А, вообще, если хотите научиться грамотно оформлять свой код, советую почитать о более менее общепринятых конвенциях http://opensource.adobe.com/wiki/dis...ng+Conventions

Старый 14.03.2010, 13:10
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Да не я то вкурсе что и зачем. Просто интересно было все же зачем ИМЕННО тут супер конструктор. ну да ладно.

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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