Форум 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=146486)

Vilya21 09.11.2010 15:34

В массиве одинаковые объекты
 
Здравствуйте.
Вроде всё должно быть просто, но никак не получается.
Есть экземпляр класса Stone, наследованый от MovieClip.
Есть StoneFactory, которая отдаёт этот объект.
В контроллере пишу ф-ию, которая создаёт новый камень и добавляет его в массив всех камней.
Так вот проблема в том что вроде бы пишу 'new', массив камней заполняется, но выходит что в массиве ссылка на один и тот же камень.

Класс Stone:
Код AS3:

public class Stone extends MovieClip {
 
                public var X:int;
                public var Y:int;
 
                public var Xo:int;
                public var Yo:int;
                public var Vx:Number;
                public var Vy:Number;
 
                public var type:String;
                public var weight:int;
                public var V:Number;
                public var T:int = 0; //Сколько времени летит снаряд
                public var flagStop:Boolean = false; //Остановился ли снаряд
                public var flagInWater:Boolean = false; //В воде ли снаряд
                public var stoneRotation:Number = 0; //Скорость вращения снаряда
                public var selfDirection:Number = 0; //Коэффициент самонаведения (для коровы)
                public var partsNum:int = 0; //Количество частей, на которое разделяется снаряд
                public var baseV:Number = 0; //Базовая скорость маленьких снарядов после разделения
                public var randomV:Number = 0; //Случайная составляющая скорости маленьких снарядов после разделения
 
                public function Stone():void {
 
                }
 
        }



Класс StoneFactory:
Код AS3:

public class StoneFactory {
 
                private var _stones:Array = new Array();
 
 
                //Синглтон
                private static var _instance:StoneFactory;
                public static function GetInstance():StoneFactory {
                        if (_instance == null) { _instance = new StoneFactory() };
                        return _instance;
                }
 
                public function StoneFactory():void {
                        var model:Model = Model.GetInstance();
                        //Первое оружие
                        var simpleStone:Stone = new Stone();
                        simpleStone.type = 'simpleStone';
                        simpleStone.weight = 100;
                        simpleStone.Xo = model.startStoneX;
                        simpleStone.Yo = model.startStoneY;
                        simpleStone.stoneRotation = 50;
                        var mcSimpleStoneImage:MovieClip = new MovieClip();
                        mcSimpleStoneImage = ClassParser.CreateDisplayObjectByName('Graph_Stone');
                        simpleStone.addChild(mcSimpleStoneImage);
                        _stones.push(simpleStone);
 
                }
 
                public function getStone(itype:String):Stone {
                        for each(var stone:Stone in _stones) {
                                if (stone.type == itype) { return stone };
                        }
                        var newStone:Stone = new Stone();
                        return newStone;
                }
 
 
 
 
        }


Контроллер:
Код AS3:

//Ф-ия, выстреливающая снаряды (как мои, так и кораблей)
                private function create_stone(itype:String, iXo:Number, iYo:Number, iVxo:Number, iVyo:Number):void {
                        var model:Model = Model.GetInstance();
                        var view:View = View.GetInstance();
                        var stoneFactory:StoneFactory = StoneFactory.GetInstance();
 
                        var stone:Stone = new Stone();
                        stone = stoneFactory.getStone(itype);
                        view.mcBackground.addChild(stone);
 
                        stone.Xo = iXo;
                        stone.Yo = iYo;
                        stone.Vx = iVxo;
                        stone.Vy = iVyo;
 
                        model.stones.push(stone);
 
 
                }

Камень вылетает только один раз, хотя с каждым вызовом ф-ии должен появляться новый камень. Не могу понять в чём проблема. Если надо - вышлю весь исходник.

leofit 09.11.2010 15:41

Мб из за этого?
Код AS3:

                        var stone:Stone = new Stone();
                        stone = stoneFactory.getStone(itype);

Сначала Вы создаете новый камень, потом это перебиваете на камень из массива, и в массив идет клон камня из массива?

Bgg 09.11.2010 15:42

А это чо?
Код AS3:

                        for each(var stone:Stone in _stones) {
                                if (stone.type == itype) { return stone };
                        }

Может оно и возвращает все тот же экземпляр камня?

cleptoman 09.11.2010 15:54

так у вас type для всех камней одинаковый задается.

ваш getStone дергает первый попавшийся стоун из массива и все. в чем уникальность то?

апд..не внимательно прочитал (

попробуйте так:
Код AS3:

public function getStone(itype:String):Stone {
        for each(var stone:Stone in _stones) {
                if (stone.type == itype) { return stone };
        }
        var newStone:Stone = new Stone();
        newStone.type = itype;
        return newStone;
}


Vilya21 09.11.2010 16:50

2 leofit:
Массив камней - это model.stones
А беру я из фабрики, перед этим написав new Stone().
Если я ничего не путаю - то в массив model.stones добавится новый обьект.

2 Bgg:
Это перебор видов камней в фабрике.
Возвращает объект по его типу.

2 Cleptoman:
В этой функции рабочий только цикл for each, всё что после - это чтобы компилятор не ругался. У меня всегда запрашиваются существующие типы камней, поэтому функция должна заканчиваться на первом return'e.

leofit 09.11.2010 17:04

Если Вы вызываете
Код AS3:

create_stone('simpleStone', ....

То будет всегда возвращаться один и тот же объект

Vilya21 09.11.2010 17:09

А как сделать чтобы возвращался каждый раз новый объект, но с заполненными свойствами?

-De- 09.11.2010 17:10

Если вы пишете
a = new B();
то это выделяет память под новый обьект, если затем сразу написать
a = c;
то на ту выделенную память уже (обычно) не будет ссылок и её сожрёт (когда проголодается) GC. А а будет указывать на некий старый обьект с, не имеющий к новому никакого отношения.
Компилятор не будет ругаться, если напишете просто return null;

Vilya21 09.11.2010 17:26

Тогда по идее - если я напишу в StoneFactory в ф-ии getStone 'new Stone()'

Код AS3:

for each(var stone:Stone = new Stone() in _stones) {
                if (stone.type == itype) { return stone };
        }

то должна выделиться память под новый объект, ф-ия вернёт ссылку на этот объект в переменную stone в контроллере. Но таким образом всё равно не получается. =(

-De- 09.11.2010 17:32

Нет такого синтаксиса, там должно тупо обьявление итератора стоять.
Вы что сделать хотите? В массив добавить элемент? Ну так я думаю вы знаете, как это делается =)


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

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