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

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

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

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Tools Создать кучу объектов через функцию

Приветствую всех.
У меня такой вопрос.
Есть много объектов которые прописываю по несколько строк, но строки одинаковые, только меняются названия переменных:
Код AS3:
// Объекты
private vrediska:Rediska_obj;
private vaflya:Vaflya_obj;
private botinok:Botinok_obj;
//Материалы
private var Rediska_BAM:BitmapAssetMaterial;
private var Vaflya_BAM:BitmapAssetMaterial;
private var Botinok_BAM:BitmapAssetMaterial;
 
public class Nabor extends DisplayObject3D
{	
rediska=new Rediska_obj(Rediska_BAM);
addChild(rediska);
ViewportArray[4].addDisplayObject3D(rediska);
 
vaflya=new Vaflya_obj(Vaflya_BAM);
addChild(vaflya);
ViewportArray[3].addDisplayObject3D(vaflya);
 
botinok=new Botinok_obj(Botinok_BAM);
addChild(botinok);
ViewportArray[4].addDisplayObject3D(botinok);
 
// и таких много
}
Я предполагаю, что можно же как то создать функцию типа:
Код AS3:
public function buildObj(geom:DisplayObject3D,mat:MaterialObject3D,viewPort:int):void
		{
			geom = new geom(mat) ;
			addChild(geom);
			ViewportArray[vp].addDisplayObject3D(geom);
		}
Что бы писать только : buildObj(Rediska_obj,Rediska_BAM,4);

Но я что то не так пишу и оно не работает. Прошу помощи от знающих.
Заранее спасибо.

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
public function buildObj(geom:DisplayObject3D,mat:MaterialObject3D,viewPort:int):void
		{
			geom = new geom(mat) ;
			addChild(geom);
			ViewportArray[viewPort].addDisplayObject3D(geom);
		}

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

Регистрация: Apr 2009
Сообщений: 117
Интересная логика...
Код AS3:
geom = new geom(mat);
С таким же успехом можно писать
Код AS3:
var mySprite:Sprite = new Sprite();
mySprite = new mySprite();
И ничего работать не будет

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
объекты в данной задаче это отдельные классы? по - какому алгоритму будет вызываться функция, которая должна создавать новый объект?
__________________
местонахождение

Старый 05.04.2010, 09:18
Crenth вне форума Посмотреть профиль Отправить личное сообщение для Crenth Найти все сообщения от Crenth
  № 5  
Ответить с цитированием
Crenth
[+1 19.06.10]
[+1 27.07.10]
 
Аватар для Crenth

Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
можно сделать типа так:
Код AS3:
function createMyObject(value1:datatype) : ObjectClass
{var newObj : ObjectClass = new ObjectClass();
 newObject.property1=value1;
 objectArray.push(newObj);
 return newObj; 
}
 
...
addChild(createMyObject('rediska'));
...
термин ObjectClass только замените на то, что вам нужно (например, MovieClip или Sprite)
у меня такая конструкция работает
в objectArray лежат все ваши созданные налету объекты
addChild вынес за пределы функции создания, так как иногда не нужно сразу добавлять объект на сцену, но он должен быть создан

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

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Я делал похожую задачу, реализовал через конструктор в базовом классе. Все объекты были наследники от базового класса, соответственно перекрывались только необходимые методы. А в базовом классе был создан метод construct
Код AS3:
package code 
{
	import flash.display.Sprite;
	import code.event.GameEvent;
	import flash.events.Event;
	import code.enemy.*;
	import code.friend.*;
 
	/**
	 * Игровой объект
	 * @author KingPeas
	 */
	public class GameObject extends Sprite
	{
 
		public function GameObject() 
		{
			setCenterCoordinate();
			addEventListener(Event.ADDED_TO_STAGE, hnAddedToStage);
			cacheAsBitmap = true;
			mouseEnabled = false;
			this.initValue();
		}
		/**
		 * Создание нового игрового объекта
		 * @param	property	свойства объекта
		 * @param	currentPos	текущее смещение карты
		 * @return	возвращается игровой объект
		 */
		static public function construct(property:XML, currentPos:int):GameObject {
			var go:GameObject;
 
			switch(uint(property.@t)) {
				case 1:
					go = new IronBlock();
					break;
				case 2:
					go = new WoodBlock();
					break;
				case 3:
					go = new EnemyShip();
					break;
				case 6:
					go = new Bullet();
					break;
				case 7:
					go = new Sputnik();
					break;
				case 8:
					go = new Score();
					break;
				case 9:
					go = new Mine();
					break;
				case 10:
					go = new Life();
					break;
				default:
					go = new GameObject();
			}
			go.initProperty(property);
			go.x -= currentPos;
			return go;
		}
...
}
Вот как то так.
И соответственно чтобы получить объект мне нужно было только знать его тип определенный в xml. Передавая указание какой тип объекта надо создать я получал на выходе готовый объект столько раз сколько это было необходимо.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ


Последний раз редактировалось SunShadow; 05.04.2010 в 11:30.
Старый 05.04.2010, 21:01
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 7  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Быть может я не так обрисовал картину.

Поясню по другому:
Я постоянно делаю 3 действия для создания каждого объекта
Код AS3:
// 1 создать объект КЛАССА Rediska_obj с МАТЕРИАЛОМ Rediska_BAM
rediska=new Rediska_obj(Rediska_BAM); 
// 2 добавить объект в сцену         
addChild(rediska);  
// 3  отображать объект в заданном слое                                       
ViewportArray[4].addDisplayObject3D(rediska); вьюпорта
КЛАСС - это унаследованные от DisplayObject3D классы которых много и у каждого свои названия (например Rediska_obj).
МАТЕРИАЛ - это унаследованный от MaterialObject3D класс (BitmapAssetMaterial пока) у которого меняется лишь имя текстуры при объявлении экземпляра: var Rediska_BAM:BitmapAssetMaterial = new BitmapAssetMaterial("имя_текстуры");
В итоге нужно написать функцию где я буду указывать КЛАСС объекта и ИМЯ_ТЕКСТУРЫ в качестве аргументов.
Что то типа:
function createObj (КЛАСС: DisplayObject3D,ИМЯ_ТЕКСТУРЫ: MaterialObject3D)
{
создать объект КЛАССА Rediska_obj с МАТЕРИАЛОМ Rediska_BAM
}

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

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Может тогда как то вот так попробовать
Код AS3:
public function buildObj(geom:Class,mat:Class,viewPort:int):void
		{
			var displObj:DisplayObject3D = new geom(mat) ;
			addChild(displObj);
			ViewportArray[vp].addDisplayObject3D(displObj);
		}
Вы путаете ссылки на сам класс и на объекты созданные от этого класса. Не факт что будет сходу работать, но копать по моему в этом направлении
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
да и наверное, не стоит тут делать addChild, лучше возвращать созданный displObj.
__________________
местонахождение

Старый 06.04.2010, 15:20
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 10  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Большое, человеческое СПАСИБО всем и особенно SunShadow
Заработало.

Добавлено через 2 часа 55 минут
АААААААААА.
Работает, но только когда как.
Короче ещё один камень всплыл.
ИТак пишу:
Код AS3:
public function createObj ():void
{
buildObj(LIV_neft_bochka,"LIV_neft_bochka_tex",3);
buildObj(LIV_neft_datchik,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_lestnica,"LIV_neft_bochka_tex",4);
buildObj(LIV_neft_otsos,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_tonkosloj,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_trubw,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_trubw2,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_water,"Water",6);
}
 
public function buildObj(geom:Class,texture:String,viewPort:int):void
		{
			//создать материал			
			var mater:BitmapAssetMaterial=new BitmapAssetMaterial(texture);
                        //создать объект
			var displObj:DisplayObject3D = new geom(mater) ;
                        //разместить объект в сцене и в слое вьюпорта
			addChild(displObj);
			ViewportArray[viewPort].addDisplayObject3D(displObj);
		}
Но при компиляции пишет: 5005: Неизвестная ошибка при оптимизации байтового кода.

Коментирую пару обектов:
Код AS3:
buildObj(LIV_neft_bochka,"LIV_neft_bochka_tex",3);
buildObj(LIV_neft_datchik,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_lestnica,"LIV_neft_bochka_tex",4);
buildObj(LIV_neft_otsos,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_tonkosloj,"LIV_neft_trubw_tex",5);
buildObj(LIV_neft_trubw,"LIV_neft_trubw_tex",5);
//buildObj(LIV_neft_trubw2,"LIV_neft_trubw_tex",5);
//buildObj(LIV_neft_water,"Water",6);
И всё компилируется отлично.
Сначала грешил на закоментированные объекты, но когда оставил только их, они чудесно скомпелировались.

Напомню, что LIV_neft_bochka, LIV_neft_datchik, LIV_neft_lestnica и т.д. это отдельно описанные классы унаследованые от DisplayObject3D. (В них описана геометрия)
Работаю во Flash cs4.

ВОТ НАШЁЛ ОТВЕТ И ЛЕКАРСТВО: http://www.flasher.ru/forum/showthre...ighlight=5005:


Последний раз редактировалось 3Desian; 06.04.2010 в 18:53.
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:24.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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