Просмотр полной версии : AS2, mtasc и this.
Здравствуйте!
Вот не могу понять такую вещь. Во FlashIDE для того чтобы узнать где я нахожусь (в каком объекте), например для трассирования я делал такую команду
trace("This "+this);
И мне показывался полный путь до текущего объекта.
При компиляции через mtasc я тоже пытаюсь определить путь, например с помощью трассировки через flashout такой командой
Flashout.info("This "+this);
и где бы не дал эту команду, в логе получаю
This [object Object]
Что делаю не так, и как можно узнать путь до текущего объекта, в котором выполняется код?
this указывает на текущую область видимости, это может быть не только мувиклип, но и любой другой объект. В том же IDE можно получить [object Object]
function a () {
trace (this);
}
o = {};
o.b = function () {
trace (this);
};
a ();
o.b ();
В вашем случаи this вызывается не из мувиклипа.
Можно добавить, что trace() неявно вызывает метод toString():
function whois() {trace (this);}
o = {};
o1 = {};
o1.toString = function(){ return "it's me, your object";}
o.whois = o1.whois = whois;
whois(); //_level0
o.whois(); //[object Object]
o1.whois(); //it's me, your object
Да вполне явно он его вызывает.
toString() у MovieClip возвращает путь к клипу. Там же _target и targetPath.
В вашем случаи this вызывается не из мувиклипа.
А вот я попробовал сделать так
class gamerender extends MovieClip
{
function gamerender () {
Flashout.info("Gamerender constructor, this "+this);
this.gameinit();
}
function gameinit()
{
Flashout.info("Gameinit start, this "+this);
}
}
и подключаю этот класс так
var gamerenderinstance:gamerender=new gamerender();
В логе все так же имею
Gamerender constructor, this [object Object]
Gameinit start, this [object Object]
Почему снова нет пути в this? Класс gamerender - это же теперь полноценный мувиклип.
Еще вопрос - а почему вообще работает вызов this.gameinit()? По идее, если this не содержит путь к объекту, то как может вызваться его метод? Тут должна быть ошибка, а ее нет.
Вообще, меня интересует, как писать классы - производные от MovieClip, чтобы в их коде можно было свободно пользоваться this, и this содержал осмысленное значение. Пожалуйста, дайте примерчик такого класса, и кода который делает инстанс этого класса в виде клипа.
Названия классов должны начинаться с прописной (заглавной) буквы, ни больше, ни меньше.
MovieClip не создается через конструктор, клипы с классом создаются через attachMovie. Так что был создан объект, но это не MovieClip.
Про «если this не содержит путь к объекту, то как может вызваться его метод?» ничего не понял.
з.Ы. Есть ещё методы создания клипа без создания мувика в библиотеке, например у меня для этого есть класс McFactory (можно найти на форуме). Но это не очень хорошее решение.
Названия классов должны начинаться с прописной (заглавной) буквы, ни больше, ни меньше.
MovieClip не создается через конструктор, клипы с классом создаются через attachMovie. Так что был создан объект, но это не MovieClip.
Названия классов и файлов переделал.
Подключение Gamerender теперь делаю так
class Application
{
private var scopeRef:MovieClip;
function Application(scope:MovieClip)
{
scopeRef = scope;
var gamerenderinstance:Gamerender=new Gamerender();
scopeRef.attachMovie("gamerenderinstance","gamerenderins");
scopeRef.gamerenderins.printthis();
}
static function main()
{
var appinstance:Application = new Application(_root);
}
}
В классе Gamerender метод printthis() такой
class Gamerender extends MovieClip
{
function Gamerender () {
Flashout.info("Gamerender constructor, this "+this);
this.gameinit();
}
function gameinit()
{
Flashout.info("Gameinit start, this "+this);
}
function printthis()
{
Flashout.info("Gamerender print this "+this);
}
}
Все это компилится без ошибок. Но! Судя по логу, вызова метода printthis() не происходит. Лог такой
Gamerender constructor, this [object Object]
Gameinit start, this [object Object]
а "Gamerender print this ..." нету. То есть ничего с приаттаченыйм мувиком сделать не могу. Чего еще я не учел? Какой всеже правильный код подключения класса как мувика?
PS: Да, приписал методу printthis ключевое слово public. Ничего не изменилось, он всеравно не вызывается.
OMG, купите уже книгу по AS2, господи…
Ещё раз: экземпляры-наследники MovieClip НЕ создаются оператором new, ВООБЩЕ. Вы ничего не поняли, совершенно. Откройте хелп, прочитайте про то, как прописывать класс и linkage для мувиклипа в библиотеке и как создавать экземпляры таких клипов. Ей богу. Если не сработал attachMovie, значит клипа с linkage равным gamerenderinstance в либе нет, либо на этот клип не прописан соответствующий класс. А строка с new вообще не рабочая.
OMG, купите уже книгу по AS2, господи…
Ещё раз: экземпляры-наследники MovieClip НЕ создаются оператором new, ВООБЩЕ. А строка с new вообще не рабочая.
Тогда должна же быть ошибка при компиляции, или на хуйдой конец во время исполнения swf-плейер должен popup-окно вываливать чтоли с ошибкой. ...Ну это так, про юзабельность... Кроме того, срабатывают конструкторы, они же в каком-то контексте выполняются... И при этом экземляр не создается. Как-то грустно это.
Вы ничего не поняли, совершенно. Откройте хелп, прочитайте про то, как прописывать класс и linkage для мувиклипа в библиотеке и как создавать экземпляры таких клипов.
Как это делать в Flash IDE я знаю. Точнее, я знаю как связывать конкретный мувиклип с конкретным классом. Причем знаю как это сделать в AS1 стиле и в AS2 стиле с назначением класса. Но нужно не это. Нужно мне понять, как любой класс связать с мувиком-заготовкой? Вот здесь http://www.flasher.ru/forum/showpost.php?p=605206&postcount=4 вы написали "в библитеке должен быть пустой мувик с идентификатором и назначенным классом PicFlower". А если классов много? Это что, для каждого класса нужно мышой во Flash IDE создавать мувик-пустышку, и в его свойствах прописывать принадлежность к данному классу? Сколько классов, столько и мувиков-пустышек должно быть?
Хочется просто кодом (без IDE, и без хаков) создавать классы наследователи мувиклипа. Пускай имея один (!) мувик в качестве заготовки. Но создавать классы в любом необходимом количестве. Это невозможно?
Тогда должна же быть ошибка при компиляции, или на хуйдой конец во время исполнения swf-плейер должен popup-окно вываливать чтоли с ошибкой. ...Ну это так, про юзабельность... Кроме того, срабатывают конструкторы, они же в каком-то контексте выполняются... И при этом экземляр не создается. Как-то грустно это.
Окошко будет в AS3. Но там клипы через конструктор создаются.
Как это делать в Flash IDE я знаю. Точнее, я знаю как связывать конкретный мувиклип с конкретным классом. Причем знаю как это сделать в AS1 стиле и в AS2 стиле с назначением класса. Но нужно не это. Нужно мне понять, как любой класс связать с мувиком-заготовкой? Вот здесь http://www.flasher.ru/forum/showpost.php?p=605206&postcount=4 вы написали "в библитеке должен быть пустой мувик с идентификатором и назначенным классом PicFlower". А если классов много? Это что, для каждого класса нужно мышой во Flash IDE создавать мувик-пустышку, и в его свойствах прописывать принадлежность к данному классу? Сколько классов, столько и мувиков-пустышек должно быть?
Хочется просто кодом (без IDE, и без хаков) создавать классы наследователи мувиклипа. Пускай имея один (!) мувик в качестве заготовки. Но создавать классы в любом необходимом количестве. Это невозможно?
Да, официально — клип-пустышку. Если хочется без пустышки, то можно хаком (http://flasher.ru/forum/showpost.php?p=579229&postcount=9).
Да, официально — клип-пустышку. Если хочется без пустышки, то можно хаком (http://flasher.ru/forum/showpost.php?p=579229&postcount=9).
Пояснение для читающих (и для меня если забуду): __etc имеет в виду, что в AS2 официальный путь создания класса-наследователя MovieClip - только путем создания клипа-пустышки в Flash IDE. Этому клипу в Linkage - опциях (правая кнопка мышки на клипе в библиотеке) задается символьный идентификатор и указывается класс. Если у нас несколько классов, которые мы хотим сделать наследователями MovieClip, мы должны для каждого создать отдельный мувиклип-пустышку, и на нем указать идентификатор и класс. Поправьте если я неправильно понял.
Хаком получилось сделать, спасибо. И this начал содержать осмысленную строку. Честноговоря, не совсем удобно устроен create-метод, при копировании его в новый класс надо следить за именами в коде данного метода (везде надо прописать название текущего класса). Пока не сообразил, можно ли переделать его так чтоб просто копировать в новый класс. Ну это уже детали.
Тут (http://www.flash-mx.ru/forum/topic_show.pl?pid=12962;hl=#pid12962) была небольшая дискуссия на сей счет. Лично я не вижу ничего плохого в использовании данного хака, учитывая что в AS3 создание мувика сделано по-человечески. Но не стоит забывать о композии, о которой напомнил Нокс. То есть, вы создаете обычный мувик, а класс не расширяете от MovieClip, а делаете как обычно с помощью new передавая ссылку на созданный мувик. Тогда класс будет выглядить примерно так:
import mx.utils.Delegate;
class NewClass {
private var __mc:MovieClip = null;
function NewClass (mc:MovieClip) {
__mc = mc;
__mc.onRelease = Delegate.create (this, onRelease);
}
private function echo ():Void {
trace ("Class:NewClass");
trace ("instace:" + __mc);
}
private function onRelease ():Void {
echo ();
}
}
Тогда, для ассоциации клипа с классом, надо будет написать
new NewClass (mc);
где mc - имя клипа
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.