Просмотр полной версии : как из класса получить доступ ко внутреннему мувику?
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);
Или я непонимаю что нужно сделать.
дада, интересно что static public var innerMovieClip_mc:MovieClip; нормально кушает..
не плохо было бы, чтоб кто-нибудь, понявший логику компилятора, растолковал в чем здесь фишка..
Такой метод работал в 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);
}
}
}
дада, интересно что static public var innerMovieClip_mc:MovieClip; нормально кушает..
не плохо было бы, чтоб кто-нибудь, понявший логику компилятора, растолковал в чем здесь фишка..
а кушает потому, что этой строчкой определяется статическое свойство, которое находится в области видимости класса, а не экземпляра, поэтому не происходит конфликта имен. а в конструкторе SimpleMovieClip трэйсится внутренний мувик, а не это статическое свойство. чтобы достучаться до статического свойства, стоит писать
trace(SimpleMovieClip.innerMovieClip_mc); // null
Silin: там все просто, компилятор генерирует автоматом свойства в классе по имени мувов на таймлайне, если писать полностью в Flash IDE - это работает на ура (компилятор не ругается), если работать с внешним редактором то это проблема - отключить это можно через
File -> Publish Settings -> Flash -> Action Script 3.0 Settings -> Automatically declare stage instances (галочка) . Только тогда придется в ручную указывать все таймлайн мувы
Компилятор 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. Поэтому это работает нормально. Но стат. свойство не содержит в себе ничего, что тоже логично.
Да, именно поэтому лучше писать this.innerMovieClip_mc и SimpleMovieClip.innerMovieClip_mc, дабы не заставлять лишний раз плеер искать это свойство в разных областях видимости.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.