PDA

Просмотр полной версии : как из класса получить доступ ко внутреннему мувику?


Peregrin
15.09.2007, 18:41
допустим в библиотеке у меня имеется мувик с идертефикатором класса SimpleMovieClip внутри этого мувиклипа находится другой мувиклип, экземпляр которого имеет имя innerMovieClip_mc. Теперь в файле SimpleMovieClip.as я пишу следующий код:
package
{
import flash.display.MovieClip;

public class SimpleMovieClip extends MovieClip
{

public var innerMovieClip_mc:MovieClip;

public function SimpleMovieClip()
{
trace(innerMovieClip_mc);
}

}
}
После компиляции он выдает следующую ошибку:
1151: A conflict exists with definition innerMovieClip_mc in namespace internal.

Такой метод работал в AS2, а как поступить в случае с AS3?

†‡Paladin‡†
15.09.2007, 22:05
Или
this.addChild(innerMovieClip);
Или я непонимаю что нужно сделать.

silin
16.09.2007, 01:35
дада, интересно что static public var innerMovieClip_mc:MovieClip; нормально кушает..
не плохо было бы, чтоб кто-нибудь, понявший логику компилятора, растолковал в чем здесь фишка..

island
16.09.2007, 10:54
Такой метод работал в AS2, а как поступить в случае с AS3?
можно вообще не объявлять свойство innerMovieClip_mc внутри класса SimpleMovieClip, а к мувику innerMovieClip_mc обращаться напрямую.
а если хочется автокомплит, то назовите свойство в классе по-другому, например:

package
{
import flash.display.MovieClip;

public class SimpleMovieClip extends MovieClip
{
public var innerMovieClip:MovieClip;

public function SimpleMovieClip()
{
innerMovieClip = innerMovieClip_mc;
trace(innerMovieClip);
}

}
}

island
16.09.2007, 11:18
дада, интересно что static public var innerMovieClip_mc:MovieClip; нормально кушает..
не плохо было бы, чтоб кто-нибудь, понявший логику компилятора, растолковал в чем здесь фишка..
а кушает потому, что этой строчкой определяется статическое свойство, которое находится в области видимости класса, а не экземпляра, поэтому не происходит конфликта имен. а в конструкторе SimpleMovieClip трэйсится внутренний мувик, а не это статическое свойство. чтобы достучаться до статического свойства, стоит писать
trace(SimpleMovieClip.innerMovieClip_mc); // null

7thsky™
16.09.2007, 11:33
Silin: там все просто, компилятор генерирует автоматом свойства в классе по имени мувов на таймлайне, если писать полностью в Flash IDE - это работает на ура (компилятор не ругается), если работать с внешним редактором то это проблема - отключить это можно через
File -> Publish Settings -> Flash -> Action Script 3.0 Settings -> Automatically declare stage instances (галочка) . Только тогда придется в ручную указывать все таймлайн мувы

etc
16.09.2007, 11:35
Компилятор AS3 в CS3 автоматически объявляет свойства, которые ссылаются на клипы с именами. Поэтому происходит конфликт, когда вы пытаетесь объявить свойство, которое уже объявлено.
Что касается static, то все очень просто:

package {
import flash.display.MovieClip;

public class SimpleMovieClip extends MovieClip {
public static var innerMovieClip_mc:MovieClip;

public function SimpleMovieClip() {
trace(innerMovieClip_mc); // [object MovieClip]
trace(SimpleMovieClip.innerMovieClip_mc); // null
trace(this.innerMovieClip_mc); // [object MovieClip]
}

}
}
По-моему тут очевидно все, вы объявили свойство innerMovieClip_mc в другой области видимости, а именно в static. Поэтому это работает нормально. Но стат. свойство не содержит в себе ничего, что тоже логично.

silin
16.09.2007, 11:43
внятно, спасибо..

etc
16.09.2007, 12:08
Да, именно поэтому лучше писать this.innerMovieClip_mc и SimpleMovieClip.innerMovieClip_mc, дабы не заставлять лишний раз плеер искать это свойство в разных областях видимости.