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

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

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

Регистрация: Sep 2010
Адрес: Moscow
Сообщений: 473
По умолчанию Как удалить объект из массива

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

Код AS3:
InGame.bullets.splice(InGame.bullets.indexOf(this), 1);
но он не всегда удаляет правильно, то есть, бывают случаи, когда перед удалением текущей пульки удаляется какая либо другая, массив смещается, и вот этот метод, который нашел индекс нашей пульки удаляет из массива,в котором вся индексация смещена, и получается ,что удаляется из массива не та пулька, как можно это обработать?

Старый 19.02.2014, 14:21
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

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

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

Регистрация: Sep 2010
Адрес: Moscow
Сообщений: 473
Ну я убедился в этом! я сам офигел! в итоге я переписал немного и все заработало, в условии , где у меня колизится пулька с врагами и проверяется вылет пульки за границы экрана я ставлю свойство 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();
}
}

Старый 19.02.2014, 15:55
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Так получше будет.
Код 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();
}
}
И я был не прав в предыдущем сообщении, я не подумал

Старый 19.02.2014, 22:53
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Так получше будет.
Код AS3:
if(bullet.isDead == true)
Я думаю, что получше будет сначала поставить пробел после if и перед его скобкой, потом набраться мужества и почитать справку по if, а потом придет прозрение, что дело можно усугубить дальше. И поржать, конечно.

Код AS3:
if ( ((((true === true) == true) == true) == true) == true) ...)
спойлер. Ты и так проверяешь boolean bullet.isDead.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 19.02.2014, 23:04
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 6  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
я на это даже внимания не обратил))) А лучше я употребил про присвоение элемента свойству.

Старый 20.02.2014, 05:27
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 7  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
я бы все таки делал это статичной функцией , аля InGame.removeBullet(this);


Последний раз редактировалось Isfet; 20.02.2014 в 10:28.
Старый 20.02.2014, 09:20
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
спойлер. Ты и так проверяешь boolean bullet.isDead.
Как бы да, но по этому вопросу можно и холивар развернуть)
Многие намеренно пишут явную проверку, чтобы проще было читать. Понятно, что в этом случае для программы разницы нет, но вот при чтении человеком, будет сразу понятно, что там булево значение, а не приведение к типу Boolean.
Что бы ты подумал, если бы увидел вот такой кусок г-кода? (не обращая внимания на то, что тут названия не по конвенциям)
Код AS3:
if (someObject.hasOne) {
   // some code
}
Что hasOne это Boolean? Или может это проверка на null с неявным приведением к Boolean, например?

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

Старый 20.02.2014, 11:34
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 9  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Код AS3:
InGame.bullets.splice(InGame.bullets.indexOf(this), 1);
indexOf возвращает -1, если объект не найден.
splice при удалении с -1 удаляет последний элемент.
Без if'а не обойтись.

Старый 20.02.2014, 17:56
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 10  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
но вот при чтении человеком, будет сразу понятно, что там булево значение
так оно и так понятно, ведь isЖе

Добавлено через 3 часа 59 минут
Цитата:
Что бы ты подумал, если бы увидел вот такой кусок г-кода?
Feathers писал ***-кодер, там есть строчка -
Код AS3:
var hasNameInitializer:Boolean = false;

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

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

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


 


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


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