![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 42
|
Всем привет.
Ситуация такая. Есть некий объект на экране, при клике мышкой он выстреливает другой объект, который летит в сторону, куда указывал курсор в момент клика. Через какое-то время таких "снарядов" становится очень много. Хотелось бы их убирать как только они улетают за определенные границы. Создаю снаряд в обработчике события клика. private function handlerShipFire(event:MouseEvent):void{ var missile:Missile = new Missile(3, 0xff00000, ship.x, ship.y, mouseX, mouseY); addChild(missile); ammo.push(missile); } for each(var missile:Missile in ammo){ missile.x += missile.directionX * missile.getMissileSpeed(); missile.y += missile.directionY * missile.getMissileSpeed(); } выдается ошибка ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. Как вообще правильно убивать такие объекты, чтобы они спокойно удалялись и не висели в памяти? |
|
|||||
|
Регистрация: Nov 2007
Сообщений: 51
|
Ну "правильнее" будет так:
if((missile.x < -50 || missile.x > 500) && contains(missile)) { removeChild(missile); ammo.splice(ammo.indexOf(missile), 1); } плюс у Вас в коде удаление из массива указано не было, а о нём также не нужно забывать ![]() |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 42
|
Заработало, спасибо.
А почему if (contains(missile)) исправило дело? Я почитал описание contains(), но немного не понял, что оно исправило конкретно в моем случае. Я так понимаю, что просто проверилось, присутствует ли данный объект на сцене? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Да, именно так. Прежде чем удалять объект, надо проверить, есть ли он в том контейнере, из которого его удаляют. Иногда также следует сначала проверить, не содержит ли переменная-ссылка (здесь missile) null, иначе и проверка на contains вызовет ошибку))
__________________
Reality.getBounds(this); |
|
|||||
|
Вы не удаляли пули из массива, таким образом пули пытались удалиться повторно при следующей проверке на выход из границ.
Добавлено через 2 минуты т.е. в принципе, если делать должно работать и без Добавлено через 5 минут да, и обход лучше делать не по оригиналу массива, а по его копии |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 42
|
Т.е. если применять removeChild() к объекту, которые не отображается на сцене, то вылезет ошибка?
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Нет, не так. Удаление объекта из контейнера вызовет ошибку, если в контейнере такого объекта нет. Отображается в данное время контейнер или нет - не играет роли. Главное - есть ли удаляяемый объект в контейнере.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|