Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как удалить объект из массива (http://www.flasher.ru/forum/showthread.php?t=206673)

Vansimar 19.02.2014 12:09

Как удалить объект из массива
 
Есть массив пулек, если пулька улетает за границу экрана или попадает в цель ,то я ее удаляю из массива так:

Код AS3:

InGame.bullets.splice(InGame.bullets.indexOf(this), 1);

но он не всегда удаляет правильно, то есть, бывают случаи, когда перед удалением текущей пульки удаляется какая либо другая, массив смещается, и вот этот метод, который нашел индекс нашей пульки удаляет из массива,в котором вся индексация смещена, и получается ,что удаляется из массива не та пулька, как можно это обработать?

Akopalipsis 19.02.2014 14:21

Странно.. Как такое может быть? Вы передали пульку на удаление и только в методе определился индекс, ход выполнения прерывается и в этот метод попадает другая пулька. Индекс пересчитывается. но старый где-то сохраняется... Даже представить сложно, как такое возможно.

Vansimar 19.02.2014 15:49

Ну я убедился в этом! я сам офигел! в итоге я переписал немного и все заработало, в условии , где у меня колизится пулька с врагами и проверяется вылет пульки за границы экрана я ставлю свойство isDead в true,
а потом в цикле апдейта я проверяю isDead и там же удаляю если в тру это значение
Код AS3:

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

Так получше будет.
Код AS3:

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();
}
}

И я был не прав в предыдущем сообщении, я не подумал:)

dimarik 19.02.2014 22:53

Цитата:

Сообщение от Akopalipsis (Сообщение 1160306)
Так получше будет.
Код AS3:

if(bullet.isDead == true)


Я думаю, что получше будет сначала поставить пробел после if и перед его скобкой, потом набраться мужества и почитать справку по if, а потом придет прозрение, что дело можно усугубить дальше. И поржать, конечно.

Код AS3:

if ( ((((true === true) == true) == true) == true) == true) ...)

спойлер. Ты и так проверяешь boolean bullet.isDead.

Akopalipsis 19.02.2014 23:04

я на это даже внимания не обратил))) А лучше я употребил про присвоение элемента свойству.

Isfet 20.02.2014 05:27

я бы все таки делал это статичной функцией , аля InGame.removeBullet(this);

caseyryan 20.02.2014 09:20

Цитата:

спойлер. Ты и так проверяешь boolean bullet.isDead.
Как бы да, но по этому вопросу можно и холивар развернуть)
Многие намеренно пишут явную проверку, чтобы проще было читать. Понятно, что в этом случае для программы разницы нет, но вот при чтении человеком, будет сразу понятно, что там булево значение, а не приведение к типу Boolean.
Что бы ты подумал, если бы увидел вот такой кусок г-кода? (не обращая внимания на то, что тут названия не по конвенциям)
Код AS3:

if (someObject.hasOne) {
  // some code
}

Что hasOne это Boolean? Или может это проверка на null с неявным приведением к Boolean, например?

Цитата:

я бы все таки делал это глобальной функцией , аля InGame.removeBullet(this);
Это не глобальная функция

Psycho Tiger 20.02.2014 11:34

Код AS3:

InGame.bullets.splice(InGame.bullets.indexOf(this), 1);

indexOf возвращает -1, если объект не найден.
splice при удалении с -1 удаляет последний элемент.
Без if'а не обойтись.

Akopalipsis 20.02.2014 17:56

Цитата:

но вот при чтении человеком, будет сразу понятно, что там булево значение
так оно и так понятно, ведь isЖе:)

Добавлено через 3 часа 59 минут
Цитата:

Что бы ты подумал, если бы увидел вот такой кусок г-кода?
Feathers писал ***-кодер, там есть строчка -
Код AS3:

var hasNameInitializer:Boolean = false;



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

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