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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.11.2010, 15:34
Vilya21 вне форума Посмотреть профиль Отправить личное сообщение для Vilya21 Найти все сообщения от Vilya21
  № 1  
Ответить с цитированием
Vilya21

Регистрация: Aug 2009
Сообщений: 75
Smile В массиве одинаковые объекты

Здравствуйте.
Вроде всё должно быть просто, но никак не получается.
Есть экземпляр класса 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);
 
 
		}
Камень вылетает только один раз, хотя с каждым вызовом ф-ии должен появляться новый камень. Не могу понять в чём проблема. Если надо - вышлю весь исходник.

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

Регистрация: Dec 2009
Сообщений: 428
Мб из за этого?
Код AS3:
			var stone:Stone = new Stone();
			stone = stoneFactory.getStone(itype);
Сначала Вы создаете новый камень, потом это перебиваете на камень из массива, и в массив идет клон камня из массива?
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг

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

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
А это чо?
Код AS3:
			for each(var stone:Stone in _stones) {
				if (stone.type == itype) { return stone };
			}
Может оно и возвращает все тот же экземпляр камня?

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
так у вас 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;
}
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью


Последний раз редактировалось cleptoman; 09.11.2010 в 15:59.
Старый 09.11.2010, 16:50
Vilya21 вне форума Посмотреть профиль Отправить личное сообщение для Vilya21 Найти все сообщения от Vilya21
  № 5  
Ответить с цитированием
Vilya21

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

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

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

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

Регистрация: Dec 2009
Сообщений: 428
Если Вы вызываете
Код AS3:
create_stone('simpleStone', ....
То будет всегда возвращаться один и тот же объект
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг

Старый 09.11.2010, 17:09
Vilya21 вне форума Посмотреть профиль Отправить личное сообщение для Vilya21 Найти все сообщения от Vilya21
  № 7  
Ответить с цитированием
Vilya21

Регистрация: Aug 2009
Сообщений: 75
А как сделать чтобы возвращался каждый раз новый объект, но с заполненными свойствами?

Старый 09.11.2010, 17:10
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 8  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Если вы пишете
a = new B();
то это выделяет память под новый обьект, если затем сразу написать
a = c;
то на ту выделенную память уже (обычно) не будет ссылок и её сожрёт (когда проголодается) GC. А а будет указывать на некий старый обьект с, не имеющий к новому никакого отношения.
Компилятор не будет ругаться, если напишете просто return null;
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 09.11.2010, 17:26
Vilya21 вне форума Посмотреть профиль Отправить личное сообщение для Vilya21 Найти все сообщения от Vilya21
  № 9  
Ответить с цитированием
Vilya21

Регистрация: Aug 2009
Сообщений: 75
Тогда по идее - если я напишу в StoneFactory в ф-ии getStone 'new Stone()'

Код AS3:
for each(var stone:Stone = new Stone() in _stones) {
		if (stone.type == itype) { return stone };
	}
то должна выделиться память под новый объект, ф-ия вернёт ссылку на этот объект в переменную stone в контроллере. Но таким образом всё равно не получается. =(

Старый 09.11.2010, 17:32
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 10  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Нет такого синтаксиса, там должно тупо обьявление итератора стоять.
Вы что сделать хотите? В массив добавить элемент? Ну так я думаю вы знаете, как это делается =)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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