![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2009
Сообщений: 75
|
Здравствуйте.
Вроде всё должно быть просто, но никак не получается. Есть экземпляр класса Stone, наследованый от MovieClip. Есть StoneFactory, которая отдаёт этот объект. В контроллере пишу ф-ию, которая создаёт новый камень и добавляет его в массив всех камней. Так вот проблема в том что вроде бы пишу 'new', массив камней заполняется, но выходит что в массиве ссылка на один и тот же камень. Класс Stone: 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: 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; } } Контроллер: //Ф-ия, выстреливающая снаряды (как мои, так и кораблей) 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); } |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 428
|
Мб из за этого?
Сначала Вы создаете новый камень, потом это перебиваете на камень из массива, и в массив идет клон камня из массива?
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг |
|
|||||
|
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
А это чо?
Может оно и возвращает все тот же экземпляр камня? |
|
|||||
|
так у вас type для всех камней одинаковый задается.
ваш getStone дергает первый попавшийся стоун из массива и все. в чем уникальность то? апд..не внимательно прочитал ( попробуйте так:
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью Последний раз редактировалось cleptoman; 09.11.2010 в 15:59. |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 75
|
2 leofit:
Массив камней - это model.stones А беру я из фабрики, перед этим написав new Stone(). Если я ничего не путаю - то в массив model.stones добавится новый обьект. 2 Bgg: Это перебор видов камней в фабрике. Возвращает объект по его типу. 2 Cleptoman: В этой функции рабочий только цикл for each, всё что после - это чтобы компилятор не ругался. У меня всегда запрашиваются существующие типы камней, поэтому функция должна заканчиваться на первом return'e. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 428
|
Если Вы вызываете
То будет всегда возвращаться один и тот же объект
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 75
|
А как сделать чтобы возвращался каждый раз новый объект, но с заполненными свойствами?
|
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Если вы пишете
a = new B(); то это выделяет память под новый обьект, если затем сразу написать a = c; то на ту выделенную память уже (обычно) не будет ссылок и её сожрёт (когда проголодается) GC. А а будет указывать на некий старый обьект с, не имеющий к новому никакого отношения. Компилятор не будет ругаться, если напишете просто return null;
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 75
|
Тогда по идее - если я напишу в StoneFactory в ф-ии getStone 'new Stone()'
то должна выделиться память под новый объект, ф-ия вернёт ссылку на этот объект в переменную stone в контроллере. Но таким образом всё равно не получается. =( |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Нет такого синтаксиса, там должно тупо обьявление итератора стоять.
Вы что сделать хотите? В массив добавить элемент? Ну так я думаю вы знаете, как это делается =)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|