Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вызов класса (http://www.flasher.ru/forum/showthread.php?t=142650)

greenhill 27.07.2010 14:53

Вызов класса
 
Здравствуйте, простите за примитивный вопрос, но не могу справится пока
У меня есть consructor.fla
В библиотеке есть мувик Selector, экспортирован в экшн скрипт.
и есть Selector.as в папке as.
как мне проинклудить его в фла, чтоб работал скрипт из Selector.as
у меня еще несколько отдельных as файлов будет, как вызывать из друг из друга?

Хемуль 27.07.2010 14:57

2 greenhill:
Цитата:

как мне проинклудить его в фла, чтоб работал скрипт из Selector.as
Задать ему в свойствах Selector в качестве Base class. Ну, в смысле, не просто Selector, а полностью, со структурой пакетов типа: com.myDomain.myProject.Selector. Это в том случае, если у вас есть эти самые пакеты.

Цитата:

у меня еще несколько отдельных as файлов будет, как вызывать из друг из друга?
Это не сильно понятный вопрос.

greenhill 27.07.2010 15:01

ну скажем один класс у меня описывает парснг xml, а второй создает спрайты и загружает туда изображения и отображает их.
как мне в том файле, где парсинг, вызвать класс, который создает спрайты и отображает картинки?

Хемуль 27.07.2010 15:04

2 greenhill:
Вам нужно создать экземпляр этого класса. Ну или не создавать, если класс статический.
Почитайте про include.

greenhill 27.07.2010 15:18

Цитата:

Задать ему в свойствах Selector в качестве Base class. Ну, в смысле, не просто Selector, а полностью, со структурой пакетов типа: com.myDomain.myProject.Selector. Это в том случае, если у вас есть эти самые пакеты.
у меня все локально и там нет ни com ни myDomain, просто папка с проектом и вложенными папками

Zebestov 27.07.2010 15:41

Допустим у тебя есть папка с проектом. В ней же лежит файл something.fla. В ней же лежит папка /as, в которой просто лежат все твои *.as файлы.

1. Указываешь Flash-у, что все *.as файлы у тебя хранятся в папке /as:
File > Publish Settings... > вкладка Flash > Script: ActionScript 3.0 Settings... > вкладка Source path > /as

2. В качестве основного класса своего swf создаешь некий as/Main.as и прописываешь его в Flash:
окно Properties > свиток PUBLISH > Class: пишешь Main.as

Дальше все по аналогии. Создаешь свой as/Selector.as и в библиотеке своему мувику правой кнопкой мыши:
Properties... + галочка Export for ActionScript + Base Class: указываешь Selector.as

Добавлено через 5 минут
А ну и главное — оперируй вертикально вниз... т.е. твой мувик Selector должен иметь имя, например, selector и обращайся к нему из Main.as:

Код AS3:

...
this.selector.someMethod();
...


greenhill 28.07.2010 13:04

спасибо огромное, Zebestov, за подробный ответ!

Добавлено через 2 часа 34 минуты
Еще вопрос:
Есть главный класс, в нем я создаю экземпляр класса AddImages, он рабочий, парсит XMl и выводит изображения.
Экземпляр создан, компилит без ошибок, но почему-то не отображается на экране. Может там не достаточно просто написать
Код AS3:

addChild(preview_list_block);

?

Zebestov 28.07.2010 15:46

хм. без кода никаких вариантов. я даже не знаю, что такое preview_list_block

greenhill 28.07.2010 15:52

Код AS3:

package{
 
        import flash.display.*;
 
 
        public class Main extends Sprite{
 
                public function Main(){
 
                        var myImageLoader:AddImages = new AddImages(); // Создаем экземпляр класса AddImages
 
                        myImageLoader.traceImageLoader = function(){
                                trace(myImageLoader.publicTest)// Yo!!!
                        }
                        myImageLoader.traceImageLoader();
 
                }
 
        }
 
}

Код AS3:

package {
        import flash.events.*;
        import flash.net.*;
        import flash.display.*;
 
 
        dynamic class AddImages extends Sprite{
 
                public var publicTest:String = "Yo!!!";
 
                public var xmlURL:String = "xml/images.xml";
                public var xmlData:XML;
                public var urlLoader:URLLoader;
                public var previewArray:Array = new Array();
                public var imageArray:Array = new Array();
 
                public var preview_list_block:Sprite = new Sprite();
 
                public var preview_blocks:Array = new Array();
                public var loader:Loader;
                public var imageLoader:Loader;
 
 
                public function AddImages(){
 
                        addChild(preview_list_block); // Не отображается, далее в этот контейнер грузятся изображения
 
 
                        parseXML();
 
                } ....


Zebestov 28.07.2010 16:00

опуская прочие вопросы, спрошу по существу:

1. ты подготовился к загрузке XML — а где ты его таки загружаешь?
2. ты подготовился к загрузке, как я понимаю, картинок — а где сама загрузка?

я так понимаю, все скрыто под неочевидным parseXML() — давай и его сюда.

greenhill 28.07.2010 16:01

Окей :)

Код AS3:

package {
        import flash.events.*;
        import flash.net.*;
        import flash.display.*;
 
 
        dynamic class AddImages extends Sprite{
 
                public var publicTest:String = "Yo!!!";
 
                public var xmlURL:String = "xml/images.xml";
                public var xmlData:XML;
                public var urlLoader:URLLoader;
                public var previewArray:Array = new Array();
                public var imageArray:Array = new Array();
                public var preview_list_block:Sprite = new Sprite();
                public var preview_blocks:Array = new Array();
                public var loader:Loader;
                public var imageLoader:Loader;
                public var imageGeneralBlock:Sprite = new Sprite();
                public var imageBlocks:Array = new Array();
 
 
                public function AddImages(){
 
                        addChild(preview_list_block);
                        preview_list_block.x = 0;
                        preview_list_block.y = 0;
 
                        addChild(imageGeneralBlock);
                        imageGeneralBlock.x = 200;
 
                        parseXML();
 
                }
 
                private function parseXML(){
 
                        var urlRequest:URLRequest = new URLRequest(xmlURL);
                        urlLoader = new URLLoader();
                        urlLoader.addEventListener(Event.COMPLETE, completeListener);
                        urlLoader.load(urlRequest);
                }
 
                private function completeListener(e:Event){
                        xmlData = new XML(urlLoader.data);
 
                        for(var i:Number = 0; i < xmlData.children().length(); i++){
 
                                previewArray[i] = xmlData.image.@preview[i];
                                imageArray[i] = xmlData.image.@image[i];
 
                                var preview_sprite:Sprite = new Sprite(); // Создаем Спрайты, в которые в дальнейшем подгружаем изображения, размещаем их в общем блоке для превью
                    preview_blocks.push(preview_sprite);
                                preview_list_block.addChild(preview_blocks[i]);
 
 
                                preview_blocks[i].buttonMode = true;
                                preview_blocks[i].addEventListener(MouseEvent.CLICK, showImage(i));
 
                        }
 
                        previewLoader(0);
                }
 
                var preview_x:Number = 0;
                var preview_y:Number = 0;
                var preview_i = 0;
 
                private function previewLoader(i){
                        loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
                        loader.load(new URLRequest(previewArray[i]));
                }
 
                private function initListener(e:Event):void{
                        preview_blocks[preview_i].addChild(loader);
                        preview_blocks[preview_i].x = preview_x;
                        preview_blocks[preview_i].y = preview_y;
 
                        preview_y += preview_blocks[preview_i].height + 20;
                        preview_i++;
 
                        if(preview_i < previewArray.length){ //Проверяем наличие еще превьюшек
                            previewLoader(preview_i);
                        }
                }
 
                private function showImage(i:int):Function{
 
                        return function(e:Event){
 
                                imageLoader = new Loader();
                            imageLoader.contentLoaderInfo.addEventListener(Event.INIT, initImageLoader);
                            imageLoader.load(new URLRequest(imageArray[i]));
 
                    }
                }
 
                private function initImageLoader(e:Event){
                        imageGeneralBlock.addChild(imageLoader);
 
                }
 
        }
}

Код надо будет почистить. Это первые пробы на АС3

Добавлено через 3 минуты
Раньше это был отдельный класс принадлежащий AddImages.fla и все корректно работало

Zebestov 28.07.2010 16:13

хм. может все-таки в Main.as дописать:

Код AS3:

addChild(myImageLoader);

:D

greenhill 28.07.2010 16:17

аааааа...!!
Спасибо:) Вот и сидишь из-за таких глупостей 2 часа :(

Zebestov 28.07.2010 16:18

не ну видишь — это с самого начала нужно было предположить, а я и сам прошлепал =)

greenhill 28.07.2010 16:24

Ну вы то могли хоть предположить, а я еще прокалываюсь на таких моментах из-за только вот начинания АС3 :)
Еще раз спасибо!

Добавлено через 1 час 27 минут
Если у меня в классе есть обращение к объекту (кнопка), которая находится на сцене главного .fla и instance name у него button
Пишет мне 1120: Access of undefined property button

Zebestov 28.07.2010 18:08

обращаешься из Main?

greenhill 28.07.2010 18:13

Неа, из AddImages

Zebestov 28.07.2010 18:27

тогда все верно — button является свойством класса Main. если он нужен именно в AddImages, можно передавать ссылку на button в качестве аргумента:

Код AS3:

public function AddImages(button:SimpleButton):void
{
        ...
}

и в Main создавай экземпляр так:

Код AS3:

var myImageLoader:AddImages = new AddImages(button);

...как один из вариантов

greenhill 28.07.2010 18:44

ухты, так просто :) спасибо
с меня ящик пива :)

Добавлено через 22 часа 58 минут
если можно еще вот такой вопрос
в AddImages создаю экземпляр класса Main
и вот что пишет
Error: Error #2136: SWF-файл file:///L|/%21ProL/M%26Ms/constructor%5F015/main.swf содержит недопустимые данные.
как тут поступить?

Добавлено через 23 часа 2 минуты
Код AS3:

var main_ex:Main = new Main();



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

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