![]() |
|
||||||||||
|
|||||
|
Приветствую всех.
У меня такой вопрос. Есть много объектов которые прописываю по несколько строк, но строки одинаковые, только меняются названия переменных: // Объекты 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); // и таких много } public function buildObj(geom:DisplayObject3D,mat:MaterialObject3D,viewPort:int):void { geom = new geom(mat) ; addChild(geom); ViewportArray[vp].addDisplayObject3D(geom); } Но я что то не так пишу и оно не работает. Прошу помощи от знающих. Заранее спасибо. |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 117
|
Интересная логика...
С таким же успехом можно писать И ничего работать не будет ![]() |
|
|||||
|
объекты в данной задаче это отдельные классы? по - какому алгоритму будет вызываться функция, которая должна создавать новый объект?
__________________
местонахождение |
|
|||||
|
[+1 19.06.10]
[+1 27.07.10] Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
|
можно сделать типа так:
function createMyObject(value1:datatype) : ObjectClass {var newObj : ObjectClass = new ObjectClass(); newObject.property1=value1; objectArray.push(newObj); return newObj; } ... addChild(createMyObject('rediska')); ... у меня такая конструкция работает в objectArray лежат все ваши созданные налету объекты addChild вынес за пределы функции создания, так как иногда не нужно сразу добавлять объект на сцену, но он должен быть создан |
|
|||||
|
Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
|
Я делал похожую задачу, реализовал через конструктор в базовом классе. Все объекты были наследники от базового класса, соответственно перекрывались только необходимые методы. А в базовом классе был создан метод construct
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. |
|
|||||
|
Быть может я не так обрисовал картину.
Поясню по другому: Я постоянно делаю 3 действия для создания каждого объекта // 1 создать объект КЛАССА Rediska_obj с МАТЕРИАЛОМ Rediska_BAM rediska=new Rediska_obj(Rediska_BAM); // 2 добавить объект в сцену addChild(rediska); // 3 отображать объект в заданном слое ViewportArray[4].addDisplayObject3D(rediska); вьюпорта МАТЕРИАЛ - это унаследованный от MaterialObject3D класс (BitmapAssetMaterial пока) у которого меняется лишь имя текстуры при объявлении экземпляра: var Rediska_BAM:BitmapAssetMaterial = new BitmapAssetMaterial("имя_текстуры"); В итоге нужно написать функцию где я буду указывать КЛАСС объекта и ИМЯ_ТЕКСТУРЫ в качестве аргументов. Что то типа: function createObj (КЛАСС: DisplayObject3D,ИМЯ_ТЕКСТУРЫ: MaterialObject3D) { создать объект КЛАССА Rediska_obj с МАТЕРИАЛОМ Rediska_BAM } |
|
|||||
|
Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
|
Может тогда как то вот так попробовать
Вы путаете ссылки на сам класс и на объекты созданные от этого класса. Не факт что будет сходу работать, но копать по моему в этом направлении
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ |
|
|||||
|
да и наверное, не стоит тут делать addChild, лучше возвращать созданный displObj.
__________________
местонахождение |
|
|||||
|
Большое, человеческое СПАСИБО всем и особенно SunShadow
Заработало. Добавлено через 2 часа 55 минут АААААААААА. Работает, но только когда как. Короче ещё один камень всплыл. ИТак пишу: 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); } Коментирую пару обектов: 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, время: 11:13. |
|
|
« Предыдущая тема | Следующая тема » |
|
|