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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.05.2013, 20:33
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 1  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
По умолчанию Обращение к переменной подгружаемой swf-ки

1.)Объясните, пожалуйста, почему при загрузке в файл А файла Б, дети класса loadedClass Файла Б переименовываются? Конкретный пример. rect переименовывается в instance3.

Файл А.

Код AS3:
loader.load(new URLRequest("../lib/loadedClass.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderListener);
 
private function loaderListener(e:Event):void {
		var sprite:Sprite  = e.currentTarget.content;
		addChild(sprite);
	trace(sprite.getChildAt(0).name); //instance3 , а не rect. Вот тут идёт замена имени, как это работает?
		}
Файл Б.

Код AS3:
package a {
	import flash.display.Shape;
	import flash.display.Sprite;
	public class loadedClass extends Sprite {
	public var rect:Shape;
	public var test:String = "89";	
		public function loadedClass() {
 
		rect = new Shape();
		rect.graphics.lineStyle(1);
		rect.graphics.drawRect(20, 20, 20, 20);
		this.addChild(rect);
		}
 
	public static function tracer():void{
		trace("tracer!");
		}
	}
}
2.) А как исходя из этого кода, обратиться к переменной
Код AS3:
public var test:String = "89";
через загруженный экземпляр -
Код AS3:
var sprite:Sprite  = e.currentTarget.content;
?

Старый 19.05.2013, 20:38
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
не переименовывается там ничего.
Поле name дисплей объекта, и название переменной в классе не имеют ничего общего.

Простой пример:
Код AS3:
 
rect = new Shape();
rect.graphics.lineStyle(1);
rect.graphics.drawRect(20, 20, 20, 20);
this.addChild(rect);
trace(rect.name); // выдаст тоже что-то на подобие instance01

Старый 19.05.2013, 20:41
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 3  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
caseyryan, спасибо. Но почему тогда у меня не выходит обратиться к ребенку/переменной rect вот так sprite.rect ? Или это невозможно?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
потому что тип данных Sprite. А у спрайта нет свойства rect.
То есть в этом случае надо писать не
Код AS3:
var sprite:Sprite  = e.currentTarget.content;
а
Код AS3:
var sprite:loadedClass   = e.currentTarget.content as loadedClass;
Но работать это не будет, потому что программа не знает что такое loadedClass.
Советую почитать про интерфейсы.

Старый 19.05.2013, 21:03
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 5  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
caseyryan, еще раз Огромное спасибо.

Старый 19.05.2013, 23:33
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Idon'tKnow, на форуме принято для каждого вопроса создавать отдельную тему, и уж тем более неприемлемым является заголовок с перечислением вопросов. В данном случае вопрос по сути один: "Обращение к переменной подгружаемой swf-ки".
__________________
Поймай яблоко 2!

Старый 19.05.2013, 23:44
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 7  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
Zebestov, прошу прощения. Я просто думал это одна и та же проблема.
Продолжая тему,

Вопрос:
Код AS3:
var sprite:Sprite  = (e.currentTarget.content);
trace(sprite);// [object loadedClass] Т.е возвращает объект типа loadedClass? 
trace(sprite.test);// Но обратиться к этому свойству не даёт...
Вроде, как было сказано caseyryan'ом, sprite является типом Sprite, но почему трейсится
[object loadedClass] ?

P.S. Компилятор тоже выдает, что и было выше сказано...
Access of possibly undefined property test through a reference with static type flash.display:Sprite.
trace(sprite.test);

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Потому что трейс выдает то, что возвращает метод toString(). Поскольку Ваш "спрайт" на самом деле экземпляр класса loadedClass, его переопределенный toString() возвращает [object loadedClass]. Но сама переменная sprite имеет тип Sprite, у которого нет метода test(), о чем и сообщает компилятор. Он то не в курсе, что этот спрайт уже не совсем спрайт)))
__________________
Reality.getBounds(this);

Старый 19.05.2013, 23:51
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 9  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
Wolsh, благодарю! Пойду еще поковыраюсь)))

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Как уже сказал caseyryan, чтобы обратиться к такому добавленному методу расширенного класса, Ваша загружающая свф должна знать этот класс. То есть импортировать его. А это, конечно же, не всегда оптимально и даже не всегда возможно (зачем, спрашивается, делать отдельную свф с классом, который итак имеется в главной свф, да?). Поэтому в таких случаях используют интерфейсы. Интерфейс это тип данных, так же как и класс. Но интерфейс не содержит сам код методов, то есть ничего не делает. Он только гарантирует, что методы с таким названием (с точной сигнатурой) у данного экземпляра точно есть. Интерфейс тоже придется импортировать и в главную свф, и в загружаемую. Но он практически ничего не весит, не привязан ни к какой графике и никак не может вмешиваться в работу программы, поскольку не содержит самих действий.
Попробуйте.
Код AS3:
import a.ITest;
public class loadedClass extends Sprite implements ITest {
		//...
		public function test():void {
			trace("Шалость удалась!");
		}
a/ITest.as
Код AS3:
package a {
	public interface ITest {
		function test():void
	}
}
Код AS3:
import a.ITest;
loader.load(new URLRequest("../lib/loadedClass.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderListener);
 
private function loaderListener(e:Event):void {
		var sprite:ITest = e.currentTarget.content as ITest;
		addChild(sprite as Sprite);
		sprite.test();
}
__________________
Reality.getBounds(this);

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

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

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


 


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


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