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

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

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

Регистрация: Feb 2012
Сообщений: 212
По умолчанию Уникальные идентификаторы для объектов

Здравствуйте, мне нужно каждому создаваемому объекту присвоить уникальный идентификатор, который больше не встречается у других объектов. Решил, что лучше всего будет присваивать новому объекту идентификатор больший на 1, чем идентификатор предыдущего созданного объекта. Скажем, если у нас создано 10 объектов и десятый имеет идентификатор 10, то одиннадцатый будет иметь идентификатор 11 и т.д. Проблема в том, что если мы после этого удалим пятый объект и создадим новый, то его идентификатор будет равен 12, а хотелось бы что бы было 5 (после удаления объекта его идентификатор освобождается и его может занять другой объект) Подскажите, пожалуйста, как вообще можно все это организовать?

Старый 10.03.2012, 01:34
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
А для чего нужны айдишники?

Если вам необходимо к каждому объекту привязать какие-то данные, то с этой задачей как нельзя лучше справится класс Dictionary. С его помощью можно вообще обойтись без айдишников и использовать ссылку на объект как ключ для доступа к данным:

Код AS3:
var dict:Dictionary = new Dictionary();
 
var o:Object = {foo: "bar"};
 
dict[o] = "This is my data";
 
trace(dict[o]); //This is my data
__________________
тонкий тролль, осеянный благодатью


Последний раз редактировалось Gaen; 10.03.2012 в 01:37.
Старый 10.03.2012, 01:49
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 3  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
А вы используйте пул объектов, чтобы вообще не нужно было удалять объекты и освобождать идентификаторы.
А как вы вообще раздаете айдишники?
Если вам способ, предложенный товарищем Gaen не нравится, то можно сделать как-то так:


Код AS3:
class MyObject{
  // static
  private static const FREE_INDEXES : Vector.<uint> = new Vector.<uint>();
  private static var _numObjects : uint = 0;
  //
  private var _index : uint; 
  public function MyObject(){
    if(FREE_INDEXES.length){
      _index = FREE_INDEXES.pop();
    } else {
      _index = _numObjects;
    }
    _numObjects++;
  }
 
  public function destructor():void{
    FREE_INDEXES.push(_index);
    _numObjects--;
  }
}
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.


Последний раз редактировалось ChuwY; 10.03.2012 в 02:08.
Старый 10.03.2012, 01:51
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 4  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

Регистрация: Feb 2012
Сообщений: 212
Цитата:
Сообщение от Gaen Посмотреть сообщение
А для чего нужны айдишники?
Нечто вроде серийного номера. Скажем, если есть куча роботов, то нужно их различать: "ROB- 123","ROB- 124" и т.п. Идентификатор, будет отображаться, так что эфемерная ссылка не выход


Последний раз редактировалось PlutDem; 10.03.2012 в 02:14.
Старый 10.03.2012, 02:18
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Если точно по описанию задачи, то просто создайте массив с номерами удаляемых, и при создании нового сначала берите номер из этого массива, и только если он пуст - следующий из "большого" ряда. При удалении объекта соответственно кидайте его номер в массив удаленных, в запасник.
__________________
Reality.getBounds(this);

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну я не 10 секунд писал сообщение.

Добавлено через 4 минуты
ChuwY, а зачем увеличивать _numObjects когда номер взят из запасника?
__________________
Reality.getBounds(this);

Старый 10.03.2012, 02:33
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Не ну если просто чтоб _numObjects несла еще и справочный функционал "сколько вообще объектов" то пусть живет)))
__________________
Reality.getBounds(this);

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

Регистрация: Feb 2012
Сообщений: 212
Еще можно отсортировать массив объектов по идентификаторам и пройтись по нему этим циклом:
Код AS3:
for (i:int=0; objects.length < i; i++) {
	if (objects[i].id != i)
	// создаем объект с идентификатором == i
}
Если ничего не найдется, то новый идентификатор будет равен objects.length++. Хотя метод Wolsh выглядит самым простым и быстрым.

Старый 10.03.2012, 03:27
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 9  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Цитата:
Сообщение от Wolsh Посмотреть сообщение
ChuwY, а зачем увеличивать _numObjects когда номер взят из запасника?
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Не ну если просто чтоб _numObjects несла еще и справочный функционал "сколько вообще объектов" то пусть живет)))
Потому что называется numObjects, что я со своим полуотсутствующим знанием английского перевожу, как "количество объектов". То есть текущее. А если его не изменять в конструкторе\деструкторе, то свойство будет показывать максимальное количество созданных объектов и должно будет называться соответствующе. Ну maxNumCreatedObjects что ли.
Так что свойство просто следует своему названию, что гуд.

А еще все именно так, потому что я уже засыпаю и не успел подумать о экономии на этом инкременте\декременте.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 12.03.2012, 02:39
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 10  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

Регистрация: Feb 2012
Сообщений: 212
А если так?
Код AS3:
for (var i:int; i < objects.length;  i++){
    if (objects[i] == undefined)
        objects[i] = new Object(id = i);
}
Если элемент в массиве не занят, то добавляем объект туда и присваиваем ему идентификатор равный номеру элемента массива. Если свободных элементов нет, то добавляем в конец массива новый элемент и помещаем объект туда.

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

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

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


 


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


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