Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.12.2013, 03:48
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 1  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
По умолчанию Работа с созданными на сцене объектами

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

Старый 07.12.2013, 10:31
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 2  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
У вас должен быть класс текстового поля, который в конструтроре принимает значение, и записывает его в себя, а также метод 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);
}


Последний раз редактировалось Isfet; 07.12.2013 в 10:47.
Старый 07.12.2013, 14:16
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
но никак не соображу че с ними делать.
Код AS3:
this["tx" + i].text = krabi[i];
Isfet, "У вас должен быть класс" — это еще зачем? Чем Вас ТекстФилд не устроил?
__________________
Reality.getBounds(this);

Старый 07.12.2013, 15:38
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 4  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Спасибо,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?

Старый 07.12.2013, 16:55
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
У Вас какая-то каша в голове сейчас, почитайте про синхронную и асинхронную работу. Вкратце: код выполняется последовательно, весь блок, и это происходит "в одном кадре", занимая миллисекунды времени. На то, чтобы загрузить Ваш текстовый файл, времени требуется в разы больше. То есть когда выполняется код, этих данных просто НЕТ. Совсем НЕТ. Вообще. И никакие хитрости с this[] не помогут плееру узнать здесь и сейчас мгновенно, какие данные хранятся где-то на удаленном сервере. Они не могут стать ни публичными, ни традиционно воспитанными, пока не окончится процесс загрузки с удаленного сервера. Их надо ЖДАТЬ. Это называется асинхронность. Для этого существуют события, то есть что-то, что произойдет в неизвестный заранее момент времени. Не после чего-то, не перед чем-то, не в такой-то строке, и не в таком-то кадре, а фиг знает когда, и произойдет ли вообще. Однако, если вдруг когда-нибудь произойдет, лоадер (в данном случае) обязательно нам сообщит (вызовет обработчик события). И только после этого, то есть "пространственно" — в обработчике, — можно считать загруженные данные и начать ими пользоваться, то есть выполнять "дальнейший" код, который должен либо находиться в самом обработчике, либо в функции или цепочке функций, вызываемых из обработчика. Другими словами, нет никакой возможности написать свой класс загрузки данных и затем использовать его в основном коде синхронным способом
Код AS3:
var myTextLoader:TextLoader = new TextLoader("http://mySite.kz/myXML.xml");
trace(myTextLoader.textData);
, каким бы распубличным не было свойство textData.
Точно так же, как узнать высоту-ширину незагруженной картинки и т.п. асинхронные сущности.
__________________
Reality.getBounds(this);

Старый 07.12.2013, 17:42
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 6  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
Сообщение от Wolsh Посмотреть сообщение
"У вас должен быть класс" — это еще зачем? Чем Вас ТекстФилд не устроил?
ну, да, в общем случае устроит и текстфилд, все зависит от функционала.

Старый 07.12.2013, 20:39
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 7  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
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.Я так понял если инициировать внутри пакета,то эти переменные станут доступны другим классам,если инициировать в кадре,то будут доступны в кадре?Короче,что я точно понял,так это ответ связан с асинхронной работой.
(Не париться, я имел ввиду создавать текстовые поля в классе.Там уже все-равно какое имя.Можно вообще обращаться как к элементу массива)


Последний раз редактировалось DenDobriy; 07.12.2013 в 22:36.
Старый 08.12.2013, 00:02
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 8  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
чтобы избежать путаницы и получить полноценный ответ, Вам нужно отказаться от полей созданных в ручную в адобиШлеш и создать их в классе. Далее, если Вы хотите грузить в одном классе, а присваивать значение текстовым полям в другом, то тут только один вариант, передать в этот класс значение.
Класс 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');
		}
 
	}
 
}

Старый 08.12.2013, 03:04
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 9  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
чет не работает.говорит "обращение к возможно неопределенному методу..."Это он про setText (везде заменил на qq)

Старый 08.12.2013, 13:48
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 10  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
чет не работает.говорит "обращение к возможно неопределенному методу..."Это он про setText (везде заменил на qq)
Должно работать, наверное не правильно скопировали или ииз - за того, что пишете в кадрах.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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