![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Доброго времени суток. Кому не в лом,просветите пожалуйста человека.Вопрос у меня такой:
Есть несколько десятков обьектов: мувиков, текстовых полей прочего добра и есть код класса в отдельном .as файле. Как можно ими управлять оттудова? Например, в том файле есть массив с фразами var krabi:Array=[Пут, Медвед,Якун....,...] и есть 12 текстовых полей на сцене с именами tx1-tx12. Как туда вывести эти фразы?Я разобрался как обращаться к элементам способом типа: v.vector.<TextField>....v[i] и типа: object["name"+i].... но никак не соображу че с ними делать.Придумал только как создавать текстовые поля,но не как вывести в готовое на сцене поле с именем. По идее должен быть какой-то способ получить имя из обьекта на сцене(?),но я не нашел что это за оператор.Есть такой? Еще не дает покоя ,как вообще можно генерировать имена переменных из одного слова?Типа text100, "car"+"xx" В массиве только координаты Array[][], а в обьекте имя с точкой object.name1 (Камнями не кидать, я новичок в этом деле.) |
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
У вас должен быть класс текстового поля, который в конструтроре принимает значение, и записывает его в себя, а также метод setText, при вызове которого можно менять текст в текстовом поле на нужный
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; } } Последний раз редактировалось Isfet; 07.12.2013 в 10:47. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Спасибо,Wolsh.Я знал-ответ где-то совсем рядом.
Спасибо, ISfet.Ваш способ,несколько видоизмененный,мне уже советовали. И он наверное самый правильный. Но есть проблема:у меня обрабатываемый текст подгружается: 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); } Я так понимаю,это потому происходит,что вне класса нет подтверждения event для окончания загрузки? Как справиться с этой бедой и сделать значение myArray публичным? Или не париться и использовать this["name"+i].someMetodOfSomeClass= value? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
У Вас какая-то каша в голове сейчас, почитайте про синхронную и асинхронную работу. Вкратце: код выполняется последовательно, весь блок, и это происходит "в одном кадре", занимая миллисекунды времени. На то, чтобы загрузить Ваш текстовый файл, времени требуется в разы больше. То есть когда выполняется код, этих данных просто НЕТ. Совсем НЕТ. Вообще. И никакие хитрости с this[] не помогут плееру узнать здесь и сейчас мгновенно, какие данные хранятся где-то на удаленном сервере. Они не могут стать ни публичными, ни традиционно воспитанными, пока не окончится процесс загрузки с удаленного сервера. Их надо ЖДАТЬ. Это называется асинхронность. Для этого существуют события, то есть что-то, что произойдет в неизвестный заранее момент времени. Не после чего-то, не перед чем-то, не в такой-то строке, и не в таком-то кадре, а фиг знает когда, и произойдет ли вообще. Однако, если вдруг когда-нибудь произойдет, лоадер (в данном случае) обязательно нам сообщит (вызовет обработчик события). И только после этого, то есть "пространственно" — в обработчике, — можно считать загруженные данные и начать ими пользоваться, то есть выполнять "дальнейший" код, который должен либо находиться в самом обработчике, либо в функции или цепочке функций, вызываемых из обработчика. Другими словами, нет никакой возможности написать свой класс загрузки данных и затем использовать его в основном коде синхронным способом
var myTextLoader:TextLoader = new TextLoader("http://mySite.kz/myXML.xml"); trace(myTextLoader.textData); Точно так же, как узнать высоту-ширину незагруженной картинки и т.п. асинхронные сущности.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
ну, да, в общем случае устроит и текстфилд, все зависит от функционала.
|
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
Wolsh,я не совсем правильно выразился,но вы ухватили самую суть.Я абсолютный новичок и называю вещи как придется. Под еvent я как раз и подразумевал запускаемый fnComplete(обработчик) после окончания загрузки. Как вы и говорите у меня вся обработка происходит в функциях внутри обработчика и
я использую для генерации имен(идентификаторов) в цикле,а не для обеспечения публичности.
Я не мог понять:на сцене у меня имена tx1-tx12,а в коде я умею хранить значения в переменных типа object.name(нельзя же на сцене обозвать поле как тх.1?) и вы показали как с помощью this этой точки избежать. Теперь у меня внутри обработчика есть 12 переменных типа tx1:TextField="Бежать, tx2:TextField="Ломать",.... и я хочу, чтобы обьявив в первом кадре MyClass: в 12 текстовых полей,которые УЖЕ были созданы на сцене в первом кадре, с именами tx1-tx12 произошло присвоение из переменных tx1:TextField-tx12:.. которые в классе MyClass. Но эти переменные будут иметь null потому что не инициирован loader и я спросил на примере myArray как инициировать этот loader чтоб был не null.Я так понял если инициировать внутри пакета,то эти переменные станут доступны другим классам,если инициировать в кадре,то будут доступны в кадре?Короче,что я точно понял,так это ответ связан с асинхронной работой. (Не париться, я имел ввиду создавать текстовые поля в классе.Там уже все-равно какое имя.Можно вообще обращаться как к элементу массива) Последний раз редактировалось DenDobriy; 07.12.2013 в 22:36. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
чтобы избежать путаницы и получить полноценный ответ, Вам нужно отказаться от полей созданных в ручную в адобиШлеш и создать их в классе. Далее, если Вы хотите грузить в одном классе, а присваивать значение текстовым полям в другом, то тут только один вариант, передать в этот класс значение.
Класс MyClass создавайте там же где и грузите текст, инициализируйте переменную textMyClass не в конструкторе, а на уровне класса и затем передавайте в него по комплиту текст. 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); } } } |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 35
|
чет не работает.говорит "обращение к возможно неопределенному методу..."Это он про setText (везде заменил на qq)
|
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 21:48. |
|
|
« Предыдущая тема | Следующая тема » |
|
|