![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2010
Сообщений: 137
|
Здравствуйте! Появилась проблема при удалении объекта со сцены (объект находится в массиве, хотя это, скорее всего, не важно). Код:
private function collisions():void { for (var i = 0; i < Bullets.length; i++) { var temp:int; // temp в условии ниже будет равна номеру зомби в массиве, который столкнулся с пулей i if (Zombie.hitTestObject(Bullets[i])) { //проверка столкновения пули и зомби temp = knowzombi(i); trace("Попал"); removeChild(Bullets[i]); Bullets.splice(i, 1); removeChild(Zombies[temp]); Zombies.splice(temp, 1); } } } Цитата:
Вопрос в общем, почему он не удаляется? Я так понимаю, что вызываю его не в том месте, но я понятия не имею как решить данную проблему, во флеше недавно. |
|
|||||
|
Регистрация: Nov 2012
Сообщений: 4
|
Скорее всего ты проверяешь столкновение пули и зомби путем сравнения координат, зомби продолжает находится на той же координате, только его не видно, но тогда ты пытаешься удалить из списка отображения объект, которого там нет - и получаешь ошибку. Проверяй при столкновении пули с зомби находится ли зомби на экране или нет
|
|
|||||
|
Регистрация: Apr 2010
Сообщений: 137
|
Цитата:
Надеюсь я правильно понял то, что Вы написали). |
|
|||||
|
Lorem ipsum
|
В документации не указано, что аргумент метода hitTestObject должен быть объектом, расположенным на сцене. Отсюда true при сравнении и ошибка при попытке удалить со сцены то, чего на сцене нет.
Интересно, а такой код тоже выдает ошибку? private function collisions():void { for (var i = 0; i < Bullets.length; i++) { var temp:int = knowzombi(i); // temp в условии ниже будет равна номеру зомби в массиве, который столкнулся с пулей i if ((Zombies[temp] as DisplayObject).hitTestObject(Bullets[i])) { //проверка столкновения пули и зомби trace("Попал"); removeChild(Bullets[i]); Bullets.splice(i, 1); removeChild(Zombies[temp]); Zombies.splice(temp, 1); } } }
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 137
|
Но hitTestObject это же проверка того, не пересекаются ли два сравниваемых объекта, и так как после того как пуля пропала, зомби ни с кем не пересекается, что значит false. Может я и не прав, чего-то не знаю, поэтому это догадки.
И вот второй раз говорят, что пытается удалить то, чего нет. Не могу понять, он же вроде как вообще не разу не может удалится, так как хоть часами стреляй, пуля будет пропадать и всё будет происходить так, будто зомби на месте остается и никуда не девается. Ваш код тоже выдает ошибку .На всякий случай: ошибка вылазит именно тогда, когда я стреляю уже в невидимого зомби (второй и остальные разы). |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
Покажите что это за функция knowzombie() и кто такой Zombie у вас в if'e, вы всех зомби в одном мувике 'Zombie' держите? Тогда hitTest может быть тру, вы же его не удаляете.
Возможно вы удаляете не того зомби из массива, соответственно на него ссылка остаётся, а когда вы опять пытаетесь его удалить, то выскакивает ошибка. |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 137
|
Цитата:
private function createZombies(count:int) : void { for (var i = 0; i < count; i++) { Zombies[i] = Zombie; addChild(Zombies[i]); var randNumX: Number = Math.round(Math.random() * 780); var randNumY: Number = Math.round(Math.random() * 580); Zombies[i].x = randNumX; Zombies[i].y = randNumY; trace("Создался " + (i+1) + " зомби с координатами (" + randNumX + ", " + randNumY + ")."); } } zombie1 - класс самого зомби, к которому привязан символ в библиотеке. Вызывается функция из главной функции: createZombies(3); Кстати зомби должно быть три на поле, но появляется один (с этим тоже ещё не разобрался). В trace показывается, что они трое появились по разным координатам, но виден только последний (второй заменил первого, третий второго). knowzombie узнает какой именно зомби из массива Zombies столкнулся с пулей. |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
То есть по сути - Zombie это один объект, вы заполняете массив ссылками на один и тот же объект, потому и появляется всего один зомби
//если var Zombie:MovieClip = new zombie1(); //...... //тогда for (var i = 0; i < count; i++) { Zombies[i] = Zombie; //..... } //заполнит ваш массив, и в нём будет count ссылок на один и тот же объект Надо создавать нового зомби для каждого элемента массива. И ещё - вы 2 раза проверяете hitTest - в collisions, и в knowzombie - зачем ? Немного не понимаю почему всё же выдаёт hitTest. Сделайте трейс и проверьте если он выдаст вам трейс перед ошибкой, когда вы стреляете второй раз. |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 137
|
Долго писал этот пост, и когда уже дописал, всё заработало (после того как убрал второе сравнение). Поэтому если кто-то попадет в эту тему с похожей проблемой, пост оставлю написанным!
Всем спасибо за то, что откликнулись, особенно AlexLucas!! ![]() Цитата:
Цитата:
Цитата:
private function collisions():void { for (var i = 0; i < Bullets.length; i++) { var temp:int = knowzombi(i); // temp равна номеру зомби в массиве, который столкнулся с пулей i if (temp != -1) { //если temp -1, то функция knowzombie не нашла зомби, который столкнулся с пулей i removeChild(Bullets[i]); Bullets.splice(i, 1); trace("Попал"); removeChild(Zombies[temp]); Zombies.splice(temp, 1); } } } private function knowzombi(k:int) : int { //проверяем столкнулся ли какой-то зомби с пулей, если да, то - var temp:int = -1; // - возвращаем номер зомби в массиве, если нет, то возвращается -1 for (var i = 0; i < Zombies.length; i++) { if (Zombies[i].hitTestObject(Bullets[k])) { temp = i; break; } } return temp; } |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:46. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|