Форум 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=205493)

DenDobriy 07.12.2013 03:48

Работа с созданными на сцене объектами
 
Доброго времени суток. Кому не в лом,просветите пожалуйста человека.Вопрос у меня такой:
Есть несколько десятков обьектов: мувиков, текстовых полей прочего добра и есть код класса в отдельном .as файле. Как можно ими управлять оттудова? Например, в том файле есть массив с фразами var krabi:Array=[Пут, Медвед,Якун....,...] и есть 12 текстовых полей на сцене с именами tx1-tx12. Как туда вывести эти фразы?Я разобрался как обращаться к элементам способом типа:
v.vector.<TextField>....v[i]
и типа:
object["name"+i]....
но никак не соображу че с ними делать.Придумал только как создавать текстовые поля,но не как вывести в готовое на сцене поле с именем. По идее должен быть какой-то способ получить имя из обьекта на сцене(?),но я не нашел что это за оператор.Есть такой?
Еще не дает покоя ,как вообще можно генерировать имена переменных из одного слова?Типа text100, "car"+"xx"
В массиве только координаты Array[][], а в обьекте имя с точкой object.name1
(Камнями не кидать, я новичок в этом деле.)

Isfet 07.12.2013 10:31

У вас должен быть класс текстового поля, который в конструтроре принимает значение, и записывает его в себя, а также метод setText, при вызове которого можно менять текст в текстовом поле на нужный
Код AS3:

package  
{
        import flash.text.TextField;
 
 
        public class UserTextField extends TextField
        {
 
                public function UserTextField(inputText:String) {
                        this.text = inputText
                }
 
        }
          public function setText(val:String):void{
                    this.text = val;
          }
 
}

а в главном классе пишите

Код AS3:

var krabi:Array = ["Пут", "Медвед", "Якун"];
var krabiLen:uint = krabi.length;
 
var userTf:UserTextField;
for (var i:uint = 0; i < krabiLen; i++) {
        userTf = new UserTextField(krabi[i]);
        addChild(userTf);
}


Wolsh 07.12.2013 14:16

Цитата:

но никак не соображу че с ними делать.
Код AS3:

this["tx" + i].text = krabi[i];

Isfet, "У вас должен быть класс" — это еще зачем? Чем Вас ТекстФилд не устроил?

DenDobriy 07.12.2013 15:38

Спасибо,Wolsh.Я знал-ответ где-то совсем рядом.
Спасибо, ISfet.Ваш способ,несколько видоизмененный,мне уже советовали. И он наверное самый правильный.
Но есть проблема:у меня обрабатываемый текст подгружается:
Код AS3:

public class myClass{
                public var myArray:Array;
                public function myClass()
                {
                        var request:URLRequest = new URLRequest("IG.txt");
                        var variables:URLLoader = new URLLoader();
                        variables.dataFormat = URLLoaderDataFormat.VARIABLES;
                        variables.addEventListener(Event.COMPLETE, fnComplete);
                        try
                        {
                                variables.load(request);
                        }
                        catch (error:Error)
                        {
                                trace("Unable to load URL: " + error);
                        }
                }
                public function fnComplete(event:Event):void
                {
                        var loader:URLLoader = URLLoader(event.target);
                        //trace(loader.data.irrV);
                        var pattern:RegExp = /[\s]+/;
                        myArray = loader.data.irrV.split(pattern);
                }

и мой массив показывает значение только внутри класса.В другом классе и на сцене там null.
Я так понимаю,это потому происходит,что вне класса нет подтверждения event для окончания загрузки?
Как справиться с этой бедой и сделать значение myArray публичным?
Или не париться и использовать this["name"+i].someMetodOfSomeClass= value?

Wolsh 07.12.2013 16:55

У Вас какая-то каша в голове сейчас, почитайте про синхронную и асинхронную работу. Вкратце: код выполняется последовательно, весь блок, и это происходит "в одном кадре", занимая миллисекунды времени. На то, чтобы загрузить Ваш текстовый файл, времени требуется в разы больше. То есть когда выполняется код, этих данных просто НЕТ. Совсем НЕТ. Вообще. И никакие хитрости с this[] не помогут плееру узнать здесь и сейчас мгновенно, какие данные хранятся где-то на удаленном сервере. Они не могут стать ни публичными, ни традиционно воспитанными, пока не окончится процесс загрузки с удаленного сервера. Их надо ЖДАТЬ. Это называется асинхронность. Для этого существуют события, то есть что-то, что произойдет в неизвестный заранее момент времени. Не после чего-то, не перед чем-то, не в такой-то строке, и не в таком-то кадре, а фиг знает когда, и произойдет ли вообще. Однако, если вдруг когда-нибудь произойдет, лоадер (в данном случае) обязательно нам сообщит (вызовет обработчик события). И только после этого, то есть "пространственно" — в обработчике, — можно считать загруженные данные и начать ими пользоваться, то есть выполнять "дальнейший" код, который должен либо находиться в самом обработчике, либо в функции или цепочке функций, вызываемых из обработчика. Другими словами, нет никакой возможности написать свой класс загрузки данных и затем использовать его в основном коде синхронным способом
Код AS3:

var myTextLoader:TextLoader = new TextLoader("http://mySite.kz/myXML.xml");
trace(myTextLoader.textData);

, каким бы распубличным не было свойство textData.
Точно так же, как узнать высоту-ширину незагруженной картинки и т.п. асинхронные сущности.

Isfet 07.12.2013 17:42

Цитата:

Сообщение от Wolsh (Сообщение 1154516)
"У вас должен быть класс" — это еще зачем? Чем Вас ТекстФилд не устроил?

ну, да, в общем случае устроит и текстфилд, все зависит от функционала.

DenDobriy 07.12.2013 20:39

Wolsh,я не совсем правильно выразился,но вы ухватили самую суть.Я абсолютный новичок и называю вещи как придется. Под еvent я как раз и подразумевал запускаемый fnComplete(обработчик) после окончания загрузки. Как вы и говорите у меня вся обработка происходит в функциях внутри обработчика и
Код AS3:

this["name"+i].someMetodOfSomeClass= value

я использую для генерации имен(идентификаторов) в цикле,а не для обеспечения публичности.
Я не мог понять:на сцене у меня имена tx1-tx12,а в коде я умею хранить значения в переменных типа
object.name(нельзя же на сцене обозвать поле как тх.1?) и вы показали как с помощью this этой точки избежать.
Теперь у меня внутри обработчика есть 12 переменных типа tx1:TextField="Бежать, tx2:TextField="Ломать",....
и я хочу, чтобы обьявив в первом кадре MyClass:
Код AS3:

var textMyClass:MyClass= new MyClass;
textMyClass;

в 12 текстовых полей,которые УЖЕ были созданы на сцене в первом кадре, с именами tx1-tx12 произошло присвоение из переменных tx1:TextField-tx12:.. которые в классе MyClass.
Но эти переменные будут иметь null потому что не инициирован loader и я спросил на примере myArray
как инициировать этот loader чтоб был не null.Я так понял если инициировать внутри пакета,то эти переменные станут доступны другим классам,если инициировать в кадре,то будут доступны в кадре?Короче,что я точно понял,так это ответ связан с асинхронной работой.
(Не париться, я имел ввиду создавать текстовые поля в классе.Там уже все-равно какое имя.Можно вообще обращаться как к элементу массива)

Akopalipsis 08.12.2013 00:02

чтобы избежать путаницы и получить полноценный ответ, Вам нужно отказаться от полей созданных в ручную в адобиШлеш и создать их в классе. Далее, если Вы хотите грузить в одном классе, а присваивать значение текстовым полям в другом, то тут только один вариант, передать в этот класс значение.
Класс MyClass создавайте там же где и грузите текст, инициализируйте переменную textMyClass не в конструкторе, а на уровне класса и затем передавайте в него по комплиту текст.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
 
        public class Main extends Sprite
        {
                private var _textClass:YourTextClass;
 
                public function Main()
                {
                        _textClass = new YourTextClass();
                        var loader:URLLoader = new URLLoader();
                        loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioErrorHandler);
                        loader.addEventListener(Event.COMPLETE, loader_completeHandler);
                        try
                        {
                                loader.load(new URLRequest('ВАША ССЫЛКА'));
                        }catch(error:Error)
                        {
                                trace(error.message);
                        }
                }
 
                private function loader_completeHandler(event:Event):void
                {
                        ///как текст загрузился
                        _textClass.setText(/*отправляем*/);
                }
 
                private function loader_ioErrorHandler(event:IOErrorEvent):void
                {
                        trace(event.text);
                }
 
        }
 
}

Код AS3:

package 
{
        public class YourTextClass
        {
 
                public function YourTextClass()
                {
 
                }
                public function setText(/*text:String, array:Array -- тут параметры с нужным вам типом*/):void
                {
                        trace('text');
                }
 
        }
 
}


DenDobriy 08.12.2013 03:04

чет не работает.говорит "обращение к возможно неопределенному методу..."Это он про setText (везде заменил на qq)

Akopalipsis 08.12.2013 13:48

Цитата:

чет не работает.говорит "обращение к возможно неопределенному методу..."Это он про setText (везде заменил на qq)
Должно работать, наверное не правильно скопировали или ииз - за того, что пишете в кадрах.


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

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