Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создать кучу объектов через функцию (http://www.flasher.ru/forum/showthread.php?t=138319)

3Desian 04.04.2010 16:47

Создать кучу объектов через функцию
 
Приветствую всех.
У меня такой вопрос.
Есть много объектов которые прописываю по несколько строк, но строки одинаковые, только меняются названия переменных:
Код 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);

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

alatar 04.04.2010 18:00

Код AS3:

public function buildObj(geom:DisplayObject3D,mat:MaterialObject3D,viewPort:int):void
                {
                        geom = new geom(mat) ;
                        addChild(geom);
                        ViewportArray[viewPort].addDisplayObject3D(geom);
                }


GentleFLASH 04.04.2010 20:53

Интересная логика...
Код AS3:

geom = new geom(mat);

С таким же успехом можно писать
Код AS3:

var mySprite:Sprite = new Sprite();
mySprite = new mySprite();

И ничего работать не будет ;)

СлаваRa 04.04.2010 21:21

объекты в данной задаче это отдельные классы? по - какому алгоритму будет вызываться функция, которая должна создавать новый объект?

Crenth 05.04.2010 09:18

можно сделать типа так:
Код 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 вынес за пределы функции создания, так как иногда не нужно сразу добавлять объект на сцену, но он должен быть создан

SunShadow 05.04.2010 11:27

Я делал похожую задачу, реализовал через конструктор в базовом классе. Все объекты были наследники от базового класса, соответственно перекрывались только необходимые методы. А в базовом классе был создан метод 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. Передавая указание какой тип объекта надо создать я получал на выходе готовый объект столько раз сколько это было необходимо.

3Desian 05.04.2010 21:01

Быть может я не так обрисовал картину.

Поясню по другому:
Я постоянно делаю 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
}

SunShadow 05.04.2010 22:01

Может тогда как то вот так попробовать
Код AS3:

public function buildObj(geom:Class,mat:Class,viewPort:int):void
                {
                        var displObj:DisplayObject3D = new geom(mat) ;
                        addChild(displObj);
                        ViewportArray[vp].addDisplayObject3D(displObj);
                }

Вы путаете ссылки на сам класс и на объекты созданные от этого класса. Не факт что будет сходу работать, но копать по моему в этом направлении

СлаваRa 05.04.2010 22:05

да и наверное, не стоит тут делать addChild, лучше возвращать созданный displObj.

3Desian 06.04.2010 15:20

Большое, человеческое СПАСИБО всем и особенно 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:


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

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