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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.10.2009, 03:41
artemst вне форума Посмотреть профиль Отправить личное сообщение для artemst Найти все сообщения от artemst
  № 11  
Ответить с цитированием
artemst

Регистрация: Jul 2007
Сообщений: 102
Проблема оказывается в том, что я не удалял элементы из самого массива. Как собственно это сделать грамотно? Есть 3 метода, pop, splice, shift - но они все удаляют или начало или конец или несколько, а как удалить именно тот элемент который столкнулся? метод delete тоже не действует, так как он заменяет элемент на undefined, но не удаляет его

Старый 22.10.2009, 04:52
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 12  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
delete действует ) вот так он и действует
не поверишь:
Код AS3:
var arr:Array = new Array();
trace(arr[123]); // выдаст undefined 0_о
так что в цикле просто проверяй на undefined... в идеале 2 раза - в наружном и во внутреннем.

А еще лучше:
Код AS3:
public function hitsp():void {
        var i:uint;
        var j:uint;
        for each (i in listvr) {
        for each (j in listvz) {
             if (listvr[i].hitTestObject(listvz[j])) {
                  removeChild(listvr[i]);
                  removeChild(listvz[j]);
                  delete listvr[i];
                  delete listvz[j];
                  break;
             }
        }
        }
}
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 22.10.2009 в 13:46. Причина: напутал в коде ) ночь/полусон
Старый 22.10.2009, 13:41
artemst вне форума Посмотреть профиль Отправить личное сообщение для artemst Найти все сообщения от artemst
  № 13  
Ответить с цитированием
artemst

Регистрация: Jul 2007
Сообщений: 102
Zebestov - ваша функция вызывает ошибку при столкновении и вообще ничего не удаляется ))

Старый 22.10.2009, 13:48
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 14  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Теперь должно работать — надо было поменять местами delete и removeChild )
__________________
Поймай яблоко 2!

Старый 22.10.2009, 13:51
artemst вне форума Посмотреть профиль Отправить личное сообщение для artemst Найти все сообщения от artemst
  № 15  
Ответить с цитированием
artemst

Регистрация: Jul 2007
Сообщений: 102
менял, эффект такой что элемент всё-равно остаётся под видом undefined, так что просто вид ошибки меняется на "TypeError: Error #1010: A term is undefined and has no properties.".

Старый 22.10.2009, 14:12
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 16  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
На самом деле делать такое в один проход опрометчиво. если один спрайт, например, сталкивается с несколькими, то решение "в один проход" отработает только одно столкновение. Сразу после первого столкновения и удаления другие спрайты уже кагбе ни с кем не сталкиваются.

Код AS3:
public function hitsp():void {
        // здесь будем отмечать кандидатов на удаление
        var vrArr:Array = new Array();
        var vzArr:Array = new Array();
 
        var i:uint;
        var j:uint;
 
        // сначала фиксируем все столкновения
        for each (i in listvr) {
        for each (j in listvz) {
             if (listvr[i].hitTestObject(listvz[j])) {
                  vrArr[i] = 1;
                  vzArr[j] = 1;
             }
        }
        }
 
        // а потом лишь зачисточка
        for each (i in listvr) {
             if (vrArr[i] == 1) {
                  removeChild(listvr[i]);
                  delete listvr[i];
             }
        }
        for each (j in listvz) {
             if (vzArr[j] == 1) {
                  removeChild(listvz[j]);
                  delete listvz[j];
             }
        }
}
__________________
Поймай яблоко 2!

Старый 22.10.2009, 14:19
artemst вне форума Посмотреть профиль Отправить личное сообщение для artemst Найти все сообщения от artemst
  № 17  
Ответить с цитированием
artemst

Регистрация: Jul 2007
Сообщений: 102
В любом случае вы сначала присваиваете элементу значение 1, а потом если оно равно одному - присваиваете undefined (меодом delete) - соответственно элемент таки не удаляется, а ошибка всё та же. (кстати в этих двух функциях, что вы дали удаляется как раз 1 элемент при столкновении с несколькими, а код который я писал до этого с for... удаляет как и надо - все столкнвшиеся элементы), но спасибо попытку помочь

Старый 22.10.2009, 14:25
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 18  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Так погоди! как это не удаляется о_0 у тебя этот элемент еще где-то кроме массива живет? в массиве не единственная ссылка на него? если нет, то:

1. removeChild
2. удаление ссылки на него (там теперь живет undefined)
3. отсутствие слушателей (об этом ты не упоминал)

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

вот вопрос - а ты как определяешь, что элемент остался?

Добавлено через 4 минуты
Цитата:
Сообщение от artemst Посмотреть сообщение
...а код который я писал до этого с for... удаляет как и надо - все столкнвшиеся элементы
ххех ) так потому и "удаляет", что он их не удаляет (по прежнему оставляет в массиве), а лишь убирает с экрана (removeChild)
__________________
Поймай яблоко 2!

Старый 22.10.2009, 14:32
artemst вне форума Посмотреть профиль Отправить личное сообщение для artemst Найти все сообщения от artemst
  № 19  
Ответить с цитированием
artemst

Регистрация: Jul 2007
Сообщений: 102
вобщем вся проблема решилась строчкой
Код AS3:
delete listvr.splice(i,1);


Итого конечный код:

Код AS3:
public function hitsp():void {
        for(var i:uint=0;i<listvr.length;i++) {
        for(var j:uint=0;j<listvz.length;j++) {
           if (listvr[i].hitTestObject(listvz[j])) {
				removeChild(listvr[i]);
				delete listvr.splice(i,1);
           }
        }
        }
}
а элемент из массива listvz у меня удаляется в другой функции.

Старый 22.10.2009, 14:52
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 20  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Код AS3:
delete listvr.splice(i,1);
да зачем же delete?

Ваш метод не работает ) при первом же столкновении вы срезаете массив и продолжаете цикл, а listvr[i] — это уже следующий элемент, который "на лету" встал на место удаленного! так что вы по прежнему проверяете лишь первое столкновение.

Другими словами — вы запутываетесь.
Если вы ничего не утаеваете ) то метод, что я предлагал выше - работает как надо, внимательней его разберите; и если смущают пустоты undefined - ну так подставьте в мой метод свои splice вместо моих delete! это ничего не изменит кроме лишнего времени на бессмысленное "смыкание рядов"
__________________
Поймай яблоко 2!

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

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

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


 


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


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