Просмотр полной версии : Как удалить объект из массива
Vansimar
19.02.2014, 12:09
Есть массив пулек, если пулька улетает за границу экрана или попадает в цель ,то я ее удаляю из массива так:
InGame.bullets.splice(InGame.bullets.indexOf(this), 1);
но он не всегда удаляет правильно, то есть, бывают случаи, когда перед удалением текущей пульки удаляется какая либо другая, массив смещается, и вот этот метод, который нашел индекс нашей пульки удаляет из массива,в котором вся индексация смещена, и получается ,что удаляется из массива не та пулька, как можно это обработать?
Akopalipsis
19.02.2014, 14:21
Странно.. Как такое может быть? Вы передали пульку на удаление и только в методе определился индекс, ход выполнения прерывается и в этот метод попадает другая пулька. Индекс пересчитывается. но старый где-то сохраняется... Даже представить сложно, как такое возможно.
Vansimar
19.02.2014, 15:49
Ну я убедился в этом! я сам офигел! в итоге я переписал немного и все заработало, в условии , где у меня колизится пулька с врагами и проверяется вылет пульки за границы экрана я ставлю свойство isDead в true,
а потом в цикле апдейта я проверяю isDead и там же удаляю если в тру это значение
private function updateBullets():void{
var i:int = bullets.length;
while(i--)
{
if(bullets[i].isDead == true){
bullets.splice(bullets.indexOf(bullets[i]), 1);
}else
bullets[i].update();
}
}
Akopalipsis
19.02.2014, 15:55
Так получше будет.
private function updateBullets():void{
var i:int = bullets.length;
var bullet:Bullet;
while(i--)
{
bullet = bullets[i];
if(bullet.isDead == true){
bullets.splice(bullets.indexOf(bullet), 1);
}else
bullet.update();
}
}
И я был не прав в предыдущем сообщении, я не подумал:)
Так получше будет.
if(bullet.isDead == true)
Я думаю, что получше будет сначала поставить пробел после if и перед его скобкой, потом набраться мужества и почитать справку по if (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/statements.html#if), а потом придет прозрение, что дело можно усугубить дальше. И поржать, конечно.
if ( ((((true === true) == true) == true) == true) == true) ...)
спойлер. Ты и так проверяешь boolean bullet.isDead.
Akopalipsis
19.02.2014, 23:04
я на это даже внимания не обратил))) А лучше я употребил про присвоение элемента свойству.
я бы все таки делал это статичной функцией , аля InGame.removeBullet(this);
caseyryan
20.02.2014, 09:20
спойлер. Ты и так проверяешь boolean bullet.isDead.
Как бы да, но по этому вопросу можно и холивар развернуть)
Многие намеренно пишут явную проверку, чтобы проще было читать. Понятно, что в этом случае для программы разницы нет, но вот при чтении человеком, будет сразу понятно, что там булево значение, а не приведение к типу Boolean.
Что бы ты подумал, если бы увидел вот такой кусок г-кода? (не обращая внимания на то, что тут названия не по конвенциям)
if (someObject.hasOne) {
// some code
}
Что hasOne это Boolean? Или может это проверка на null с неявным приведением к Boolean, например?
я бы все таки делал это глобальной функцией , аля InGame.removeBullet(this);
Это не глобальная функция
Psycho Tiger
20.02.2014, 11:34
InGame.bullets.splice(InGame.bullets.indexOf(this), 1);
indexOf возвращает -1, если объект не найден.
splice при удалении с -1 удаляет последний элемент.
Без if'а не обойтись.
Akopalipsis
20.02.2014, 17:56
но вот при чтении человеком, будет сразу понятно, что там булево значение
так оно и так понятно, ведь isЖе:)
Добавлено через 3 часа 59 минут
Что бы ты подумал, если бы увидел вот такой кусок г-кода?
Feathers писал ***-кодер, там есть строчка -
var hasNameInitializer:Boolean = false;
Psycho Tiger
20.02.2014, 18:50
Что hasOne это Boolean? Или может это проверка на null с неявным приведением к Boolean, например?
А есть разница? :)
if (someObject.hasOne) {
// some code
}
А по мне нормально.
caseyryan
20.02.2014, 22:29
if (someObject.hasOne) {
// some code
}
А по мне нормально.
Я и не говорю, что не нормально. Но тут нельзя сказать какому типу принадлежит hasOne Булево или что-то другое
Но, по большому счету, так же пофиг писать так или делать проверку if (isDead == true) в этой записи тоже нет ничего плохого. Тут можно даже не вдумываясь, после беглого взгляда понять, что там булево
А есть разница?
В ас3 чисто визуальная, так как тут автоматическое приведение сработает, а вот в джаве, например, или в другом языке без автоприведения типов, очень даже есть.
Psycho Tiger
21.02.2014, 11:39
Я к тому, что это работает, даже если hasOne может возвращать всё что угодно – false, 0/1 или объект (null, в случае если нету).
Во всех случаях понятно, что ветка if (hasOne) пойдёт, если этот самый has.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.