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

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

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

Регистрация: Jul 2011
Сообщений: 79
По умолчанию Как передать stage и stage3D в объект другого класса?

Заголовок не полностью отражает суть вопроса.По порядку
У меня есть пара вопросов,в actionscript 3 примерно с месяц (меня на летнюю практику отправили и дали разбираться с as3 и alternativa3d) всё познать не успеваю.

Собственно вопрос следующим образом

Есть класс сцена в котором прописывается парсер создаются контроллеры пишутся stage.align и прочее.

в main файле пишется
Код:
public class Main extends Scene {}
и всё! Всё прекрасно работает.Почему?В сцене создаётся эмбед xml файла парсится и так далее.

хочется сделать по иному,чтобы в объект класса сцены передавался xml. Но в классе сцена производятся следующие манипуляции
Код:
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE
.....
stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
stage3D.requestContext3D();
И прочее,там контроллер присобачивается(которому нужно передать stage и прочие элементы.Собственно хочется перейти к такому виду
Код:
import Scene
public class Main 
public function Main{
var sc:Scene=new Scene(xml,stage);
}
(Ну что-то в этом духе не охото расписывать,но здесь вероятно придётся создавать тоже stage да?)
Судя по всему придётся всё onEnterFrame и прочее подобные вещи переносить в main да?

Вообще хочется понять разницу между подходами.В первом случае extended я вообще ничего не вызываю,но при этом всё выполняется.(Простите если глупый вопрос,просто в голове не как не уляжется).

Выдаёт ошибку что stage находится в Scene. То есть нужно производить инициализацию stage(всякие align и прочее) и stage3D(stage.stage3ds[0] и т.д.) в Main а потом передавать в сцену?

Извините за сумбурность текста и вопросов,написал как мог.

Старый 21.07.2011, 11:01
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
в первом случае (наследование: Main extends Scene ) main это объект Main со всеми свойствами\методами Stage, при его создании выполняется и все то, что прописано в конструкторе Stage

во втором случае (композиция) main просто несет на борту объект Stage, все что будет в нем сделано/определено доступно только через него же (через sc в твоем контексте)

инициализацию, связанную со stage, можно производить и в sc, но после того как stage будет в нем доступен (получит ссылку или будет добавлен в дисплейЛист, если это DisplayObject)

Старый 21.07.2011, 11:44
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 3  
Ответить с цитированием
savva

Регистрация: Jul 2011
Сообщений: 79
А в какой момент объявляется stage? stage он же имеет тип InteractiveObject и как я понимаю чтобы его передать мне нужно его иницилизировать в main?(При этом когда я делал extends Scene в сцене я нигде не объявлял stage, он просто есть откуда-то и я им пользуюсь) то бишь я попытался сделать так:

Код:
package 
{
	import flash.display.Sprite;
	import flash.display.Stage3D;
	import flash.events.Event;
		import flash.utils.ByteArray;
	import Scene;
	
	/**
	 * ...
	 * @author sa
	 */
	public class Main 
	{
		[Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
		public function Main()
		{
			var file:ByteArray = ((new EmbedModel()) as ByteArray);
			var str:String = file.readUTFBytes( file.length );
			var xml:XML = new XML( str );
			var sc:Scene = new Scene(xml, stage, stage3D);
		}
		
	}
	
}
Но в этом случае у меня undefined property stage.
мне нужно в мэйне объявить что-то вроде
Код:
var eventsource:InteractiveObject;
var stage3D:Stage3D;
....
eventsource=stage; 
stage3D = stage.stage3Ds[0];
var sc:Scene=new Scene(xml,eventsource,stage3D);
В смысле добавлен в дисплейлист?Точнее кто? Stage же он он один на всю сцену,это stage3d может быть несколько насколько я знаю(хотя и не представляю как несколькими пользоваться).
Вообще мне желательна композиция чтобы без расширения класса импортировать в любое приложение свои классы и они бы прекрасно работали.


Последний раз редактировалось savva; 21.07.2011 в 11:49.
Старый 21.07.2011, 12:23
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>> А в какой момент объявляется stage?

stage нигде не объявляется, это ссылка на объект Stage плеера, она есть у всех диплейОбжектов ( когда они добавлены в дисплей лист)

>> он же имеет тип InteractiveObject и как я понимаю чтобы его передать мне нужно его иницилизировать в main
та же песня: это ссылка\указатель, чтобы ее передать не надо ничего инициализировать..

боюсь мы немного на разных языках говорим, сори

Старый 21.07.2011, 12:42
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 5  
Ответить с цитированием
savva

Регистрация: Jul 2011
Сообщений: 79
Хорошо,тогда поставлю вопрос следующим образом.

Как мне сделать класс Main таким образом чтобы все работы со stage такие как :
Код:
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE
.....
stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
stage3D.requestContext3D();
Производились в классе не являющимся Main, а классом объект которого создаётся в Main. То бишь в мэйне находился xml парсер и всё.
Код:
package 
{
	import flash.display.Sprite;
	import flash.display.Stage3D;
	import flash.events.Event;
		import flash.utils.ByteArray;
	import Scene;
	
	/**
	 * ...
	 * @author sa
	 */
	public class Main 
	{
		[Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
		public function Main()
		{
			var file:ByteArray = ((new EmbedModel()) as ByteArray);
			var str:String = file.readUTFBytes( file.length );
			var xml:XML = new XML( str );
			var sc:Scene = new Scene(xml, /*сюда нужно передать stage*/);
		}
	}
}
при вот таком вызове
Код:
.........
	public class Main extends Sprite
	{
		[Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
		public function Main()
		{
			var sc:Scene = new Scene();
		}		
	}
}
в классе Scene появляется ошибка :
Код:
[Fault] exception, information=TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
Как передать stage в класс сцена?


Последний раз редактировалось savva; 21.07.2011 в 12:50.
Старый 21.07.2011, 14:26
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
вариант 1 (Scene - дисплейОбжект, имеет доступ к stage после addChild(sc))
Код AS3:
public class Main extends Sprite 
{
	[Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
	public function Main():void 
	{
		var file:ByteArray = ((new EmbedModel()) as ByteArray);
		var str:String = file.readUTFBytes( file.length );
		var xml:XML = new XML( str );
		var sc:Scene = new Scene(xml);
		addChild(sc);// после этого stage будет доступен в самом sc
	}
}
Код AS3:
public class Scene extends Sprite 
{
	public function Scene(xml:XML) 
	{
		trace( "xml : " + xml );
		addEventListener(Event.ADDED_TO_STAGE, init);
	}
 
	private function init(e:Event = null):void 
	{
		removeEventListener(Event.ADDED_TO_STAGE, init);
		// здесь stage это 'родное' свойство Sprite, доступное после добавления 'на сцену'
		stage.align = StageAlign.TOP_LEFT;
	}
 
}
вариант 2 (sc не добавляем на сцену, он вообще не обязательно должен быть дисплейОбжектом
Код AS3:
public class Main extends Sprite 
{
	[Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
	public function Main():void 
	{
		var file:ByteArray = ((new EmbedModel()) as ByteArray);
		var str:String = file.readUTFBytes( file.length );
		var xml:XML = new XML( str );
		var sc:Scene = new Scene(xml, stage);
	}
}
Код AS3:
public class Scene 
{
 
	public function Scene(xml:XML, stage:Stage) 
	{
		trace( "xml : " + xml );
		// здесь stage это ссылка переданная из объекта, уже имеющего ее
		stage.align = StageAlign.TOP_LEFT;
		trace( "stage : " + stage );
 
	}
}


Последний раз редактировалось silin; 21.07.2011 в 14:29.
Старый 21.07.2011, 15:12
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 7  
Ответить с цитированием
savva

Регистрация: Jul 2011
Сообщений: 79
Спасибо большое,работают оба варианта.

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

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

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


 


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


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