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

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

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

Регистрация: Apr 2009
Сообщений: 17
Question Помогите разобраться с embed swf

Есть такой код:
Код AS3:
package ru.alice {
 
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.utils.getDefinitionByName;
 
public class Symbols extends MovieClip
	{
 
		[Embed(source="../../../bin/games/game1/sym/regular/fall/0.swf", mimeType="application/octet-stream")]
		public const game1RF0:Class;
 
		[Embed(source="../../../bin/games/game1/sym/regular/fall/1.swf",mimeType="application/octet-stream")]
		public const game1RF1:Class;
 
		[Embed(source="../../../bin/games/game1/sym/regular/fall/2.swf",mimeType="application/octet-stream")]
		public const game1RF2:Class;
 
//тут много-много embed кода
 
public function Symbols()
		{
 
		}
 
public function getAsset2(n:String):Sprite
		{
			var ClassReference:Class = getDefinitionByName(this[n]) as Class;
			var s:Sprite = new Sprite();
			var m:MovieClip = new ClassReference() as MovieClip;
			s.addChild(m);
			return s;
 
		}
 
	}
 
}
Он компилируется в отдельный swf и подгружается в основной программе:
Код AS3:
 
myAppDomain = new ApplicationDomain();
var context:LoaderContext = new LoaderContext(false, this.myAppDomain);
var my_Loader:Loader = new Loader();
var my_url:URLRequest = new URLRequest("Symbols.swf");
my_Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingHandler);
my_Loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
my_Loader.load(my_url, context);
 
//....
 
private function loadingHandler(e:Event):void
{
var ClassDefinition:Class = this.myAppDomain.getDefinition("ru.alice.Symbols") as Class;
smbc = new ClassDefinition(); //тут в отладчике видно, что файл загрузился,весь embed есть.
var mc = smbc.getAsset2("game1RF0") //тут ошибка №1065
}
При попытке получить swf из по имени класса происходит ошибка:
Код:
ReferenceError: Error #1065: Переменная [class Symbols_game1RF0] не определена.
	at global/flash.utils::getDefinitionByName()
	at ru.alice::Symbols/getAsset2()
	at ru.alice::Spin3/loadingHandler()[K:\FD\Projects\ALiCEv2\src\ru\alice\Spin3.as:153]
Использую FlashDevelop.
"../../../bin/games/game1/sym/regular/fall/0.swf" - это мувик с элементами AS3.
"game1RF0" - получается в процессе работы программы, типа "имя_игры" + "режим1" + "режим2" + "№ ресурса".

Вопрос, что я делаю не так, и как сделать так, чтобы оно работало?

Старый 26.02.2013, 17:15
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 2  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Embed загружает контент при компиляции, его не нужно загружать лоадером, т.к. он уже загружен.
Что же касается выдаваемой ошибки компилятором: тот факт, что вы объявили тип переменной и указали флэшу в каком месте искать данные такого типа, ещё не означает, что переменная содержит какое-то значение до тех пор пока вы ей это значение не присвоите. В данном случае нужно присвоить свойству, экземпляр класса, соответствующему типу этого свойства.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
getDefinitionByName() принимает аргументом Строку (n), а Вы отдаете Класс (this[n]). Тот, который ищете.
__________________
Reality.getBounds(this);

Старый 26.02.2013, 19:10
HraD вне форума Посмотреть профиль Отправить личное сообщение для HraD Найти все сообщения от HraD
  № 4  
Ответить с цитированием
HraD

Регистрация: Apr 2009
Сообщений: 17
n я пробовал, ошибка та же

Добавлено через 3 минуты
Цитата:
Сообщение от yasha005 Посмотреть сообщение
Embed загружает контент при компиляции, его не нужно загружать лоадером, т.к. он уже загружен.
Что же касается выдаваемой ошибки компилятором: тот факт, что вы объявили тип переменной и указали флэшу в каком месте искать данные такого типа, ещё не означает, что переменная содержит какое-то значение до тех пор пока вы ей это значение не присвоите. В данном случае нужно присвоить свойству, экземпляр класса, соответствующему типу этого свойства.
Так там где embed, оно и компилируется отдельно, т.е. это по сути свф с ресурсами. А последнее предложение я, к сожалению, не понял.


Последний раз редактировалось HraD; 27.02.2013 в 00:27. Причина: Очепятки
Старый 26.02.2013, 19:53
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
n я пробовал, ошибка та же
Уверены, что "та же"? Откуда эта идея, что embed swf может быть представлена как просто MovieClip? Это application/octet-stream, то есть массив байт — ByteArray. Вопреки утверждению yasha005, его именно нужно загружать лоадером, только методом loadBytes (поскольку в библиотеке это ByteArray), чтобы получить доступ к его документ-классу.
__________________
Reality.getBounds(this);

Старый 26.02.2013, 20:11
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Скорее к аппдомену, нежели только к документклассу.

Добавлено через 3 минуты
getDefinitionByName работает только для текущего (корневого) аппдомена текущего security домена и имеет его контекст. Используйте getDefinition взамен.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Apr 2009
Сообщений: 17
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Уверены, что "та же"?
Ну не совсем та же...
Код:
ReferenceError: Error #1065: Переменная game1RF0 не определена.
	at global/flash.utils::getDefinitionByName()
	at ru.alice::Symbols/getAsset2()
	at ru.alice::Spin3/loadingHandler()[K:\FD\Projects\ALiCEv2\src\ru\alice\Spin3.as:153]
Цитата:
Откуда эта идея, что embed swf может быть представлена как просто MovieClip?
Из гугла.
Например http://stackoverflow.com/questions/1...m-external-swf
А почему нет, если там просто мувик в swf?
Цитата:
то application/octet-stream, то есть массив байт — ByteArray
Хорошо, как тогда это брать, чтобы оно было как MovieClip, чтоб можно было управлять его прокруткой, типа stopAtFrame, gotoAndPlay(?), делать addChild() и т.д.?

Цитата:
Используйте getDefinition взамен.
?
В коде
Код AS3:
public function getAsset2(n:String):Sprite
		{
			var ClassReference:Class = getDefinition(n) as Class;
			var s:Sprite = new Sprite();
			var m:MovieClip = new ClassReference() as MovieClip;
			s.addChild(m);
			return s;
 
		}
получаем
Код:
Error: Call to a possibly undefined method getDefinition.
или я что-то опять не понял....

П.С. Это уже пост после 2-х дневного перелопачивания гугла, StackerOverflow и подобных сайтов, перепробовал около 10-ти разных
вариантов... незнаю уже...


Последний раз редактировалось HraD; 27.02.2013 в 00:32. Причина: погорячился
Старый 27.02.2013, 01:34
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Вы даже не удосужились загуглить чей метод getDefinition? Подскажу, это метод экземпляров ApplicationDomain. Его брать у экземпляра LoaderInfo вашего Loader, которым делаете loadBytes
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вот здесь попробуйте "погуглить"...
Вложения
Тип файла: zip swfEmbed.zip (15.0 Кб, 36 просмотров)
__________________
Reality.getBounds(this);

Старый 27.02.2013, 01:43
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 10  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Помимо того, что getDefinitionByName работает только в текущем аппдомене, в параметре необходимо указывать полный путь к классу а ля "flash.display::Sprite". В конце концов, за два дня уже можно было прочитать официальную адобе справку )
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

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

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


 


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


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