PDA

Просмотр полной версии : область видимости


funkyDevil
29.01.2007, 20:44
К примеру у меня вот такой класс:

class MyClass(){

private myTween:Tween;
private myObject:Object;

public function MyClass()
{
myTween = new Tween(бла-бла-бла);
myTween.onMotionFinished = function()
{
trace(myObject);
}
}
}

В результате trace выводит undefined. Т.е. переменные моего класса изнутри обработчика onMotionFinished не видать. А надо.
Объясните, плиз, как в таком случае быть?

etc
29.01.2007, 21:00
Скобки в первой строке лишние. Плюс необходим импорт класса Tween. Плюс внутри функции область видимости другая, нужно использовать Delegate.

silin
29.01.2007, 21:25
если нужен доступ к объекту,который твиним, можно без делегирования обойтись: ссылка на него в свойстве obj твина хранится:
myTween.onMotionFinished = function()
{
trace(this.obj);
}

etc
30.01.2007, 00:06
Описывать метод в методе как-то криво совершенно :)

silin
30.01.2007, 00:39
криво смотрится, ты хотел сказать?
можно подумать что c помощью Delegate прямее..:)
хотя удобнее, спору нет..

etc
30.01.2007, 01:17
Delegate хотя бы не изменяет область видимости лишний раз. И FDT спокоен.

funkyDevil
30.01.2007, 13:12
delegate значит говорите....буду капать в этом направлении. Спасибо за наводку :)

etc
30.01.2007, 13:44
криво смотрится, ты хотел сказать?
Не только, объявление методов внутри другого противоречит ООП. Delegate в купе с EventDispatcher в AS2 приближают к реализации подобного в AS3.

funkyDevil
30.01.2007, 14:32
С delegate разобрался и пожалел, что не наткнулся на него раньше :)

Назрел вопросик о ругани FDT.

к примеру есть такой вот код:
var myClip1:MovieClip;
_root.createEmptyMovieClip("myClip1",1000);
_root.myClip1.createEmptyMovieClip("myClip2",1000);
_root.myClip1.myClip2.onPress = function(){бла-бла-бла}

Дык вот када я описываю обработчик onPress, то FDT ругается на то, что он не знает что такое myClip2. Это вообщем-то естественно, учитывая, что в var я его не прописывал.
Конструкцию var myClip1.myClip2:MovieClip флэш не понимает.
Может есть какие-нибудь другие способы успокоить FDT?

silin
30.01.2007, 14:43
myClip1 должен быть не MovieClip, а к примеру MyClip1 extends MovieClip
тогда свойство myClip2:MovieClip он сможет иметь на законных основаниях..

а успокоить можно и Flex2, тока я не буду здесь об этом, а то _etc сильно ругается...:)

funkyDevil
30.01.2007, 15:05
Это чё? Отдельный мини-класс писать чтоли для myClip1? Как то это не спортивно :) Помоему проще не реагировать на сообщения FDT.

а _etc конечно строгий, но справедливый! :)

etc
30.01.2007, 15:40
Не должно быть более одного уровня вложенности в одном классе.
в конце концов, можно пользовать:

var mc1:MovieClip = this.createEmptyMovieClip('mc1',0);
var mc2:MovieClip = mc1.createEmptyMovieClip('mc2',0)
Без прямых обращений. Или действовать по принципу XMLNode и свойствам nextSibling/prevSibling, тогда FDT даже не пикнет при десятке уровней вложенности.

funkyDevil
30.01.2007, 15:56
Не должно быть более одного уровня вложенности в одном классе.

хм..а как же быть, если я программно рисую мувик и на нём делаю текстовое поле?


Без прямых обращений. Или действовать по принципу XMLNode и свойствам nextSibling/prevSibling, тогда FDT даже не пикнет при десятке уровней вложенности.

вот в это я вообще не въехал. Не могу понять как принцип XML на структуру моих мувиков перенести. Если будет время - распиши плиз чуть подробнее.

etc
30.01.2007, 16:01
хм..а как же быть, если я программно рисую мувик и на нём делаю текстовое поле?

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

вот в это я вообще не въехал. Не могу понять как принцип XML на структуру моих мувиков перенести. Если будет время - распиши плиз чуть подробнее.
По принципу parent/child, но я бы не стал так делать.

funkyDevil
30.01.2007, 16:26
ок. Спасибо за идею с ссылками.