Форум 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)
-   -   Вложенность классов от MovieClip (http://www.flasher.ru/forum/showthread.php?t=112685)

Ruffus 05.06.2008 01:37

Вложенность классов от MovieClip
 
В основном мувике есть такой код.
Код:

var bgr: Background = Background.Create(this, "back", 0, {});
bgr.fill();

Он создаёт и рисует некоторый объект. Всё работает тут.
Теперь я его (эти строки) помещаю в конструктор некоторого класса Viewer, который сам будет создаваться в основном мувике таким же способом.
Код:

var vwr: Viewer = Background.Create(this, "viewer", 0, {});
...
public function Viewer() {        // код класса Viewer
  super();
  var bgr: Background = Background.Create(this, "back", 0, {});
  bgr.fill();
}

В результате ничего не рисуется. Я вижу, что все параметры инициализации передаются верно, но визуально ничего не происходит.

iNils 05.06.2008 02:04

Класс Viewer от чего наследуется?

Ruffus 05.06.2008 09:15

От MovieClip наследуются все классы

Волгоградец 05.06.2008 11:37

Непонятно - а почему нет слова new при создании экземпляра. А вообще у класса MovieClip нет такого свойства Background.Create (), поэтому строчка
Код:

var vwr: Viewer = Background.Create(this, "viewer", 0, {});
не должна работать. Надо от класса Background наследоваться.

Сайлас 05.06.2008 11:49

Может потому что это статик метод?

Alex_beginner 05.06.2008 11:49

Потому, что Ruffus программирует еще и на Дельфи!!!!!!!:taunt::taunt::D:D
А если серьезно, то похоже Create и есть статический метод.

silin 05.06.2008 12:32

Цитата:

Сообщение от Ruffus (Сообщение 743744)
В основном мувике есть такой код.
Код:

var bgr: Background = Background.Create(this, "back", 0, {});
bgr.fill();

Он создаёт и рисует некоторый объект. Всё работает тут.
Теперь я его (эти строки) помещаю в конструктор некоторого класса Viewer, который сам будет создаваться в основном мувике таким же способом.
Код:

var vwr: Viewer = Background.Create(this, "viewer", 0, {});
...
public function Viewer() {        // код класса Viewer
  super();
  var bgr: Background = Background.Create(this, "back", 0, {});
  bgr.fill();
}

В результате ничего не рисуется. Я вижу, что все параметры инициализации передаются верно, но визуально ничего не происходит.

да как бы и не должно ничего визуально происходить во втором случае

чтобы точно сказать, нужно знать что делает Background.Create
по-видимому создает в мувике, переданном в первом параметре, пустой мувик и перенаправляет его __proto__ на Background.prototype..

в коде на линейке ты передаешь как this реальный мувик и все получается..
а в коде в классе как this ты передаешь объект, хоть и унаследованный от MovieClip, но не имеющий дисплейного воплощения, т.е. ничего увидеть и не должен..

Ruffus 05.06.2008 14:04

Код:

public static function Create(this_movclip:MovieClip, name:String, depth:Number, init_obj:Object):Background
        {
                var out_movclip:MovieClip = this_movclip.createEmptyMovieClip(name, depth);
                var current_constructor:Function = Background;
                out_movclip.__proto__ = current_constructor.prototype;
                for (var i in init_obj)
                {
                        out_movclip[i] = init_obj[i];
                }
                current_constructor.call(out_movclip);
                return Background(out_movclip);
        }

Эту идею мне подсклазали на этом форуме.

Похоже, что silin прав чуть более, чем полностью.
Как быть тогда?

Я кстати с трудом понимаю, что делает строка
Код:

out_movclip.__proto__ = current_constructor.prototype;
Пробую в Background.Create передавать _root.
Не помогает.

silin 05.06.2008 14:24

не очень понятна логика: почему и vwr и bgr в нем ты создаешь с помощью Background.Create..
при этом vwr объявляешь как Viewer..
конструктор Viewer ни разу не исполняется (косяк еще и в этом)

если уж задумано так создавать мувики, то и Viewer должен иметь аналогичный метод Create, возвращающий экземпляр Viewer , тогда
var vwr: Viewer = Viewer.Create(this, "viewer", 0, {});
сработает (в том смысле что и конструктор будет вызван и на момент вызова конструктора экземпляр уже будет на сцене)

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

iNils 05.06.2008 15:56

Ruffus, надо использовать кнопку http://www.flasher.ru/forum/images/r...ttons/edit.gif, а не создавать несколько сообщений подряд.

В ActionScript принято с большой буквы писать только имена классов и интерфейсов, все методы и свойства пишут с маленькой. Поэтому вместо Background.Create правильнее писать Background.create

Покажите код классов Background и Viewer полностью.


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

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