Форум 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)
-   -   attachMovie в классе (Class) (http://www.flasher.ru/forum/showthread.php?t=105668)

Lorex 20.12.2007 18:19

attachMovie в классе (Class)
 
Народ такая проблема. Помогите плиз.. Читал форум может не дочитал чего... :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());
                }
}

Создаем "библиотеку" статических методов создающих клипы "на заказ" %)


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

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