PDA

Просмотр полной версии : attachMovie в классе (Class)


Lorex
20.12.2007, 18:19
Народ такая проблема. Помогите плиз.. Читал форум может не дочитал чего... :rtfm:

код класса:



class buttonery extends MovieClip {

static var levelx =50;

function buttonery (pictype:String, px:Number, py:Number)
{
var P:MovieClip;
P.attachMovie ( pictype, "picc", levelx++ );
P.picc._x=px;
P.picc._y=py;


}

}


//// код на первом кадре
//// var B1:buttonery = new buttonery ("coffee", 30,100 );
//// var B2:buttonery = new buttonery ("orange", 200,100);



Проблема, как добится появления клипа? с названиями coffee и orange которые в библиотеке и линкейджнуты стеми ж именами.???? :rtfm: КАРАУЛ!!!!

На _root - ложатся... ( _root.attachMovie ( pictype, "picc", levelx++ ); ) но ето не дело... чё тут делать???

etc
20.12.2007, 18:23
Вы где-нибудь видели стандартный класс, у которого имя с маленькой буквы начинается? Так с какого перепоя вы называете классы с маленькой буквы?

В AS1/AS2 наследники MovieClip не создаются через оператор new.

Fernando Costa
20.12.2007, 18:25
надо привязать мувик в библиотеке к классу buttonery - в поле Class укажите buttonery.
В поле identifier обзывайте как хотите и потом аттачте этот ваш мувик как обычно по его идентификатору

ЗЫ: классы пишутся с большой буквы

wvxvw
20.12.2007, 18:58
ну, или еще вариант:
клип, к которому аттачится клип из библиотеки (Р) должен существовать до того как вы вызываете на нем аттачМуви. Т.е. его нужно либо в класе либо вне, но создать и либо передавать классу ссылку на него либо ссылку на клип, в котором нужно его создать соответственно.

Lorex
20.12.2007, 19:26
Ларчик открыл таким кодом


class Buttonery extends MovieClip {


function Buttonery (pictype:String, px:Number, py:Number, sx:Number, sy:Number)
{
var nameclip = _root.getNextHighestDepth();
var nmm = "Buttonery_container"+nameclip;
_root.createEmptyMovieClip( nmm , nameclip);

eval(nmm).attachMovie (pictype , "picc", nameclip++ );
eval(nmm).picc._x=px;
eval(nmm).picc._y=py;
eval(nmm).picc._xscale =sx;
eval(nmm).picc._yscale =sy;

//trace (eval(nmm));

}

}


Код заработал....
а помог мне тут еще и trace (eval(nmm));

он выдал

_level0.Buttonery_container1
_level0.Buttonery_container0
....

а я дописывал еще _root... и флеш, зараза, не глотнул

Ларчик открылся!
СПАСИБО ВСЕМ!!!!

etc
20.12.2007, 19:28
attachMovie между прочим возвращает ссылку на созданный клип, как и createEmptyMovieClip, а вы извращаетесь в eval, да ещё в AS2. Ужас.

wvxvw
20.12.2007, 21:48
Извращение...
class MyClass {
private var __mc:MovieClip;
public function myFunction(mc:MovieClip){
__mc = mc; // #1
__mc = mc.attachMovie("blah","blah",1234); // #2
__mc = mc.createEmptyMovieClip("blah",1234); // #3
__mc = mc.createEmptyMovieClip("blah",1234).attachMovie("blah","blah",1234); // #4
}
}

Lorex
21.12.2007, 13:52
не понял...
об"ясните тупоголовому процедурщику...
в своем варианте я принимаю (передаю) аргументы
function Buttonery (pictype:String, px:Number, py:Number, sx:Number, sy:Number)
а тут вы принимаете (передаете) как аргумент мувик... как ето работает? если так написан код вроде как понимаю логику... но мне нужно передать в функцию-конструктор параметры имя клипа, ширинаX, ширинаY....

Разжуйте для тормоза .. код в создания екземпляра и код класса...
А то фрагменты одни.... Ну начинал я с eval... ниче не сделать...
Спасибо!

wvxvw
21.12.2007, 15:42
Передается не клип, а ссылка на него. Т.е. все сложные объекты (не строки\числа\константы) не дублируются при операциях с ними.
Пример:
var a:Object = {_a:100};
var b:Object = a;
b._a = 50;
trace(a._a); // output 50
eval - функция не рекомендованая к употреблению. И ее использование может привести к ошибкам, которые тяжело отследить.
В твоем случае есть 2 нормальных пути реализации:
1. Залинковать класс к клипу в библиотеке, как предложил Fernando Costa
2. Создавать экземпляр класса с помощью оператора new.
Я просто не люблю первый вариант. Но все равно попробую в двух словах объяснить. Дело в том, что MovieClip и все потомки этого класса не могут быть созданы с помощью оператора new потому что должны обязательно быть привязаными к родителю, и привязку эту никак в последствии поменять нельзя (что, слава богу, было изменено в АС3).
Т.е. чтобы создать новый клип - есть методы класса MovieClip - .attachMovie(), .createEmptyMovieClip(), .duplicateMovieClip() - все они требуют в агрументах указывать на родителя, либо родитель находится по умолчанию в определенном месте по отношению к клипу, чей метод был вызван.

Первый вариант (линкование класса к клипу в библиотеке) используется для: создания компонентов (по-другому просто не возможно). Или если дизайнер принес уже готовый UI, и нужно его только оживить (и не вдаваться в подробности где что находится, какой клип послке какого создавать и т.п. Т.е. програмер вообще не занимается графикой - она вся уже существует, нужно только добавить функционала. Если проект небольшой, графики не много, и уклон на красивости оформления, а не на функционал - это вплоне хороший способ. Так примерно и создается 90% всего, что вообще делается на флеш.

Второй вариант - предпочтительнее для проектов, где нужна сложная програмная графика.

Эволюция %)
class Buttonery extends MovieClip {
private var nameclip:Number = 0;
private var nmm:Number = "";
function Buttonery(pictype:String, px:Number, py:Number, sx:Number, sy:Number) {
nameclip = _root.getNextHighestDepth();
nmm = "Buttonery_container"+nameclip;
createEmptyMovieClip(nmm , nameclip);
var picc:MovieClip = attachMovie(pictype , "picc", getNextHighestDepth());
picc._x=px;
picc._y=py;
picc._xscale=sx;
picc._yscale=sy;

trace(this);

}
} Этот нужно аттачить из библиотеки
class Buttonery {
private var nameclip:Number = 0;
private var nmm:Number = "";
private var buttonery_mc:MovieClip;
function Buttonery(pictype:String, px:Number, py:Number, sx:Number, sy:Number) {
nameclip = _root.getNextHighestDepth();
nmm = "Buttonery_container"+nameclip;
buttonery_mc = _root.createEmptyMovieClip(nmm , nameclip);
buttonery_mc.attachMovie(pictype , "picc", buttonery_mc.getNextHighestDepth());
buttonery_mc.picc._x=px;
buttonery_mc.picc._y=py;
buttonery_mc.picc._xscale =sx;
buttonery_mc.picc._yscale =sy;

trace (buttonery_mc);

}
} Этот можно создать через new, но не красиво.
class Buttonery {
private static var __instanceCounter:Number = 0;
public static function createTypeClip(mc:MovieClip, pictype:String):MovieClip {
return mc.attachMovie(pictype, pictype+(++__depthCounter), mc.getNextHighestDepth());
}
} Создаем "библиотеку" статических методов создающих клипы "на заказ" %)