![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 102
|
Проблема оказывается в том, что я не удалял элементы из самого массива. Как собственно это сделать грамотно? Есть 3 метода, pop, splice, shift - но они все удаляют или начало или конец или несколько, а как удалить именно тот элемент который столкнулся? метод delete тоже не действует, так как он заменяет элемент на undefined, но не удаляет его
![]() |
|
|||||
|
Lorem ipsum
|
delete действует ) вот так он и действует
не поверишь: так что в цикле просто проверяй на undefined... в идеале 2 раза - в наружном и во внутреннем. А еще лучше:
__________________
Поймай яблоко 2! Последний раз редактировалось Zebestov; 22.10.2009 в 13:46. Причина: напутал в коде ) ночь/полусон |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 102
|
Zebestov - ваша функция вызывает ошибку при столкновении и вообще ничего не удаляется ))
|
|
|||||
|
Lorem ipsum
|
Теперь должно работать — надо было поменять местами delete и removeChild )
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 102
|
менял, эффект такой что элемент всё-равно остаётся под видом undefined, так что просто вид ошибки меняется на "TypeError: Error #1010: A term is undefined and has no properties.".
|
|
|||||
|
Lorem ipsum
|
На самом деле делать такое в один проход опрометчиво. если один спрайт, например, сталкивается с несколькими, то решение "в один проход" отработает только одно столкновение. Сразу после первого столкновения и удаления другие спрайты уже кагбе ни с кем не сталкиваются.
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! |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 102
|
В любом случае вы сначала присваиваете элементу значение 1, а потом если оно равно одному - присваиваете undefined (меодом delete) - соответственно элемент таки не удаляется, а ошибка всё та же. (кстати в этих двух функциях, что вы дали удаляется как раз 1 элемент при столкновении с несколькими, а код который я писал до этого с for... удаляет как и надо - все столкнвшиеся элементы), но спасибо попытку помочь
![]() |
|
|||||
|
Lorem ipsum
|
Так погоди! как это не удаляется о_0 у тебя этот элемент еще где-то кроме массива живет? в массиве не единственная ссылка на него? если нет, то:
1. removeChild 2. удаление ссылки на него (там теперь живет undefined) 3. отсутствие слушателей (об этом ты не упоминал) ведет к тому, что элемента больше нет (нет, из памяти он потом удалится) и обратиться к нему больше никак нельзя. вот вопрос - а ты как определяешь, что элемент остался? Добавлено через 4 минуты ххех ) так потому и "удаляет", что он их не удаляет (по прежнему оставляет в массиве), а лишь убирает с экрана (removeChild)
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 102
|
вобщем вся проблема решилась строчкой
![]() Итого конечный код: а элемент из массива listvz у меня удаляется в другой функции. |
|
|||||
|
Lorem ipsum
|
да зачем же delete?
Ваш метод не работает ) при первом же столкновении вы срезаете массив и продолжаете цикл, а listvr[i] — это уже следующий элемент, который "на лету" встал на место удаленного! так что вы по прежнему проверяете лишь первое столкновение. Другими словами — вы запутываетесь. Если вы ничего не утаеваете ) то метод, что я предлагал выше - работает как надо, внимательней его разберите; и если смущают пустоты undefined - ну так подставьте в мой метод свои splice вместо моих delete! это ничего не изменит кроме лишнего времени на бессмысленное "смыкание рядов"
__________________
Поймай яблоко 2! |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:14. |
|
|
« Предыдущая тема | Следующая тема » |
|
|