PDA

Просмотр полной версии : Удаление из массива


ЗлОй ПрОграММер
13.04.2011, 23:23
Главный класс Main добавляет на сцену обьекты класса Obj, и при этом записывает в своём массиве Objs эти обьекты. Мне нужно в том случае если обьект Obj уходит за сцену, из него должна вызваться функция удаления себя и удаление себя из массива Objs.
Каким образом лучше будет делать ?
можно каждому обьекту Obj присваивать его порядковый номер из массива затем parent.Objs.splice(number, 1); но боюсь что возникнет путанница, может есть другой способ ?

Bgg
13.04.2011, 23:31
Obj должен знать размеры сцены. Как только он выходит за границы, то диспатчит событие аля "iAmOutside". В Main слушать эти события и по event.target удалять из массива.

ЗлОй ПрОграММер
13.04.2011, 23:58
ну допустим я сделаю событие а как через event.target из массива удалить ?

Bgg
14.04.2011, 00:01
addEventListener("iAmOutside", outsideHandler);
//...
private function outsideHandler(event:Event):void{
var obj:Obj = event.target as Obj;
Objs.splice(obj, 1);
}

ЗлОй ПрОграММер
14.04.2011, 00:04
ОО спасиб Objs.splice(obj, 1); то что мне нужно

КорДум
14.04.2011, 00:05
Objs.splice(indexOf(obj), 1);

Bgg
14.04.2011, 00:08
гг

Objs.splice(Objs.indexOf(obj), 1);

КорДум
14.04.2011, 00:09
:D Вот жеж.
Чтобы не было флейма, вот: http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/Array.html#splice()

ЗлОй ПрОграММер
14.04.2011, 00:13
ток что проверил Objs.splice(obj, 1); так тож работает

КорДум
14.04.2011, 00:18
А не должно:
function splice(startIndex:int, deleteCount:uint, ... values):Array
Если только у вас вместо obj каким-то чудом не оказалось обычное число-индекс.

ЗлОй ПрОграММер
14.04.2011, 00:34
да нет, наврядли this в классе может являться числом
более точно будет так parent.Objs.splice(this, 1) эта строка в классе Obj

ChuwY
14.04.2011, 01:19
Более точно будет посмотреть в справку, любезно предоставленную Александром в очках.
Продублирую (http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/Array.html#slice())
И процитирую:
slice () метод
AS3 function slice(startIndex:int = 0, endIndex:int = 16777215):Array
startIndex:int (default = 0) — Число, указывающее на индекс начальной позиции среза. Если startIndex — отрицательное число, начальной позицией становится конец массива, последнему элементу которого присваивается позиция "-1".

примеры:

пример раз -- неправильный ( как у тебя. да)
var one : String = "one"; // раз
var two : String = "two"; // два
var free : String = "free"; // свободно
var array : Array = [one, two, free];
trace("arr = " + array); // arr = one,two,free
array.splice(two,1);
trace("arr = " + array); // arr = two,free
// WTF?

пример два -- правильный (как у Кордума. да) (и да, что не слишком быстр. храни индексы, используй хэш, бла-бла-бла, если тебе это не нравится)

var one : String = "one"; // раз
var two : String = "two"; // два
var free : String = "free"; // свободно
var array : Array = [one, two, free];
trace("arr = " + array); // arr = one,two,free
var idx : int = array.indexOf(two);
array.splice(idx, 1);
trace("arr = " + array); // arr = one,free
// ЧТД!

goodguy
14.04.2011, 07:55
Перед тем, как вырезать что-то из массива, нужно сначала проверить, есть ли элемент в массиве на момент вырезания

var index:int = array.indexOf(event.target);
if (index > -1) array.splice(index, 1);

ЗлОй ПрОграММер
14.04.2011, 21:08
ладно придётся исправлять мой код, спасибо что ошибку нашли

dimarik
14.04.2011, 22:08
Зато мы нашли ошибку в архитектуре. За каким тайным смыслом объект должен удалять сам себя(!) из общего массива, принадлежащего не ему(!), определяя себя на сцене(!)? Все эти проверки и пр. манипуляции должен делать агрегатор.

etc
15.04.2011, 00:31
ChuwY, так splice или slice?

dimarik
15.04.2011, 00:36
Он очепятался. Конечно, splice. После ДР обычно нужно время, чтобы войти в меридиан.