PDA

Просмотр полной версии : Вложенность классов от MovieClip


Ruffus
05.06.2008, 01:37
В основном мувике есть такой код.

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
В основном мувике есть такой код.

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 я в свое время отказался от такого способа в пользу универсальной приспособы (http://silin.fatal.ru/#AS2/manager) для создания мувиков "своего" класса, суть там та же, но все гораздо прозрачнее получается

iNils
05.06.2008, 15:56
Ruffus, надо использовать кнопку http://www.flasher.ru/forum/images/russian/style3/buttons/edit.gif, а не создавать несколько сообщений подряд.

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

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

Ruffus
05.06.2008, 16:48
Я описался
Там, разумеется var hall_viewer: Viewer = Viewer.create(_root, "hall viewer", 0, {});
Экземпляр Viewer создаётся таки же способом предварительно.
Но не видно ничего потом.


public function Viewer()
{
super();
if (__x == undefined) {__x = 0; }
if (__y == undefined) {__y = 0; }
if (__rotation == undefined) {__rotation = 0; }

_tfText = new TextFormat();
with (_tfText)
{
font = "Ar_Font";
size = 42;
align = "center";
color = 0x000000;
}

backGr = Background.create(this, "background", 0, {__bColor: 0, __fColor: 0, __pColor: 0, __pWidth: 1, __wSize: __width, __hSize: __height});
backGr.fill();

hall = Hall.create(this, "hall", 1, {_backGr: backGr});
_x = __x;
_y = __y;
_rotation = __rotation;
}
public static function create(this_movclip:MovieClip, name:String, depth:Number, init_obj:Object):Viewer
{
var out_movclip:MovieClip = this_movclip.createEmptyMovieClip(name, depth);
var current_constructor:Function = Viewer;
out_movclip.__proto__ = current_constructor.prototype;
for (var i in init_obj)
{
out_movclip[i] = init_obj[i];
}
current_constructor.call(out_movclip);
return Viewer(out_movclip);
}


public function fill()
{
var ws:Number = __wSize;
var hs:Number = __hSize;
var c:Number = __bColor;
with (this)
{
lineStyle(1, 0x000000, 0, true, "normal", "round", "round");
beginFill(c);
moveTo(0, 0);
lineTo(ws, 0);
lineTo(ws, hs);
lineTo(0, hs);
lineTo(0, 0);
endFill;
}
}
public function Background()
{
super();
if (__hSize == undefined) { __hSize = 0; }
if (__wSize == undefined) { __wSize = 0; }
if (__bColor == undefined) { __bColor = 0xD4D0C8; }
if (__pColor == undefined) { __pColor = 0x000000; }
if (__fColor == undefined) { __fColor = 0x000000; }
if (__pWidth == undefined) { __pWidth = 1; }
}
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);
}

iNils
05.06.2008, 17:00
Это не классы, их часть методов из классов.

Волгоградец
05.06.2008, 17:12
В конструкторе Viewer ты пишешь
backGr = Background.create(this, "background", 0, {__bColor: 0, __fColor: 0, __pColor: 0, __pWidth: 1, __wSize: __width, __hSize: __height});
В данном случае this - это не клип - это экземпляр класса Viewer.

silin
05.06.2008, 17:13
работающий тест твоей заморочки

var vwr:Viewer=Viewer.create(this,"viewer", 0,{_x:50,_y:50});
class Viewer extends MovieClip
{
public static function create(this_movclip:MovieClip, name:String, depth:Number, init_obj:Object):Viewer
{
var out_movclip:MovieClip = this_movclip.createEmptyMovieClip(name, depth);
out_movclip.__proto__ = Viewer.prototype;
for (var i in init_obj)
{
out_movclip[i] = init_obj[i];
}
Function(Viewer).call(out_movclip);
return Viewer(out_movclip);
}
public function Viewer()
{
var bgr:Background = Background.create(this, "bg", 0);
bgr.fill();
}
}
class Background extends MovieClip
{
public static function create(this_movclip:MovieClip, name:String, depth:Number, init_obj:Object):Background
{
var out_movclip:MovieClip = this_movclip.createEmptyMovieClip(name, depth);
out_movclip.__proto__ = Background.prototype;
for (var i in init_obj)
{
out_movclip[i] = init_obj[i];
}
Function(Background).call(out_movclip);
return Background(out_movclip);
}
public function fill()
{
lineStyle(50, 0xFF0000);
lineTo(1, 1);
}
}

Ruffus
05.06.2008, 23:15
2Волгоградец
Я это понимаю. Разве тут что-то не так?

2Silin
Может быть, я ошибаюсь, но тут то же самое написано. Переписано просто немного в части обращения к конструктору. Могу вот что сказать. У меня были в конструкторе Viewer строки

_x = __x;
_y = __y;
_rotation = __rotation;

Когда я их переставил в конец метода, всё начало рисоваться.

2iNils
Чувак, ты настоящий гений. ТЫ помог мне больше всех. Если бы не твоя внимательность в отношении регистра символов в коде, у меня бы ничего не получилось. Респект.