Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   AS2, mtasc и this. (http://www.flasher.ru/forum/showthread.php?t=97593)

xintrea 25.06.2007 04:15

AS2, mtasc и this.
 
Здравствуйте!

Вот не могу понять такую вещь. Во FlashIDE для того чтобы узнать где я нахожусь (в каком объекте), например для трассирования я делал такую команду

trace("This "+this);

И мне показывался полный путь до текущего объекта.


При компиляции через mtasc я тоже пытаюсь определить путь, например с помощью трассировки через flashout такой командой

Flashout.info("This "+this);

и где бы не дал эту команду, в логе получаю

This [object Object]


Что делаю не так, и как можно узнать путь до текущего объекта, в котором выполняется код?

iNils 25.06.2007 04:26

this указывает на текущую область видимости, это может быть не только мувиклип, но и любой другой объект. В том же IDE можно получить [object Object]
Код:

function a () {
        trace (this);
}
o = {};
o.b = function () {
        trace (this);
};
a ();
o.b ();

В вашем случаи this вызывается не из мувиклипа.

Kikasso 25.06.2007 05:44

Можно добавить, что 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


etc 25.06.2007 10:32

Да вполне явно он его вызывает.
toString() у MovieClip возвращает путь к клипу. Там же _target и targetPath.

xintrea 30.06.2007 03:41

Цитата:

Сообщение от iNils
В вашем случаи 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 содержал осмысленное значение. Пожалуйста, дайте примерчик такого класса, и кода который делает инстанс этого класса в виде клипа.

etc 30.06.2007 12:11

Названия классов должны начинаться с прописной (заглавной) буквы, ни больше, ни меньше.

MovieClip не создается через конструктор, клипы с классом создаются через attachMovie. Так что был создан объект, но это не MovieClip.

Про «если this не содержит путь к объекту, то как может вызваться его метод?» ничего не понял.

з.Ы. Есть ещё методы создания клипа без создания мувика в библиотеке, например у меня для этого есть класс McFactory (можно найти на форуме). Но это не очень хорошее решение.

xintrea 01.07.2007 02:40

Цитата:

Сообщение от __etc
Названия классов должны начинаться с прописной (заглавной) буквы, ни больше, ни меньше.

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. Ничего не изменилось, он всеравно не вызывается.

etc 01.07.2007 02:54

OMG, купите уже книгу по AS2, господи…
Ещё раз: экземпляры-наследники MovieClip НЕ создаются оператором new, ВООБЩЕ. Вы ничего не поняли, совершенно. Откройте хелп, прочитайте про то, как прописывать класс и linkage для мувиклипа в библиотеке и как создавать экземпляры таких клипов. Ей богу. Если не сработал attachMovie, значит клипа с linkage равным gamerenderinstance в либе нет, либо на этот клип не прописан соответствующий класс. А строка с new вообще не рабочая.

xintrea 01.07.2007 22:36

Цитата:

Сообщение от __etc
OMG, купите уже книгу по AS2, господи…
Ещё раз: экземпляры-наследники MovieClip НЕ создаются оператором new, ВООБЩЕ. А строка с new вообще не рабочая.

Тогда должна же быть ошибка при компиляции, или на хуйдой конец во время исполнения swf-плейер должен popup-окно вываливать чтоли с ошибкой. ...Ну это так, про юзабельность... Кроме того, срабатывают конструкторы, они же в каком-то контексте выполняются... И при этом экземляр не создается. Как-то грустно это.


Цитата:

Сообщение от __etc
Вы ничего не поняли, совершенно. Откройте хелп, прочитайте про то, как прописывать класс и linkage для мувиклипа в библиотеке и как создавать экземпляры таких клипов.

Как это делать в Flash IDE я знаю. Точнее, я знаю как связывать конкретный мувиклип с конкретным классом. Причем знаю как это сделать в AS1 стиле и в AS2 стиле с назначением класса. Но нужно не это. Нужно мне понять, как любой класс связать с мувиком-заготовкой? Вот здесь http://www.flasher.ru/forum/showpost...06&postcount=4 вы написали "в библитеке должен быть пустой мувик с идентификатором и назначенным классом PicFlower". А если классов много? Это что, для каждого класса нужно мышой во Flash IDE создавать мувик-пустышку, и в его свойствах прописывать принадлежность к данному классу? Сколько классов, столько и мувиков-пустышек должно быть?

Хочется просто кодом (без IDE, и без хаков) создавать классы наследователи мувиклипа. Пускай имея один (!) мувик в качестве заготовки. Но создавать классы в любом необходимом количестве. Это невозможно?

etc 01.07.2007 22:59

Цитата:

Сообщение от xintrea
Тогда должна же быть ошибка при компиляции, или на хуйдой конец во время исполнения swf-плейер должен popup-окно вываливать чтоли с ошибкой. ...Ну это так, про юзабельность... Кроме того, срабатывают конструкторы, они же в каком-то контексте выполняются... И при этом экземляр не создается. Как-то грустно это.

Окошко будет в AS3. Но там клипы через конструктор создаются.



Цитата:

Сообщение от xintrea
Как это делать в Flash IDE я знаю. Точнее, я знаю как связывать конкретный мувиклип с конкретным классом. Причем знаю как это сделать в AS1 стиле и в AS2 стиле с назначением класса. Но нужно не это. Нужно мне понять, как любой класс связать с мувиком-заготовкой? Вот здесь http://www.flasher.ru/forum/showpost...06&postcount=4 вы написали "в библитеке должен быть пустой мувик с идентификатором и назначенным классом PicFlower". А если классов много? Это что, для каждого класса нужно мышой во Flash IDE создавать мувик-пустышку, и в его свойствах прописывать принадлежность к данному классу? Сколько классов, столько и мувиков-пустышек должно быть?

Хочется просто кодом (без IDE, и без хаков) создавать классы наследователи мувиклипа. Пускай имея один (!) мувик в качестве заготовки. Но создавать классы в любом необходимом количестве. Это невозможно?

Да, официально — клип-пустышку. Если хочется без пустышки, то можно хаком.

xintrea 02.07.2007 02:57

Цитата:

Сообщение от __etc
Да, официально — клип-пустышку. Если хочется без пустышки, то можно хаком.

Пояснение для читающих (и для меня если забуду): __etc имеет в виду, что в AS2 официальный путь создания класса-наследователя MovieClip - только путем создания клипа-пустышки в Flash IDE. Этому клипу в Linkage - опциях (правая кнопка мышки на клипе в библиотеке) задается символьный идентификатор и указывается класс. Если у нас несколько классов, которые мы хотим сделать наследователями MovieClip, мы должны для каждого создать отдельный мувиклип-пустышку, и на нем указать идентификатор и класс. Поправьте если я неправильно понял.


Хаком получилось сделать, спасибо. И this начал содержать осмысленную строку. Честноговоря, не совсем удобно устроен create-метод, при копировании его в новый класс надо следить за именами в коде данного метода (везде надо прописать название текущего класса). Пока не сообразил, можно ли переделать его так чтоб просто копировать в новый класс. Ну это уже детали.

iNils 02.07.2007 03:20

Тут была небольшая дискуссия на сей счет. Лично я не вижу ничего плохого в использовании данного хака, учитывая что в 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 - имя клипа


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

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