8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85

Удаление объекта со сцены

14.11.2013, 07:35. Показов 3332. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток, читатели!
Такой вопрос:
создаю я значит переменную
ActionScript 3
1
var bullet:MovieClip= new mc_bullet;
использую её, а потом удаляю
ActionScript 3
1
2
3
if(contains(bullet)){
removeChild(bullet);
}
Вроде бы всё впорядке - объект со сцены удаляется, но не всё так просто. объект на самом деле не удаляется, а как будто просто становится невидимым. После этого доработал код:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
function changeBullet():void{
    switch(bulletType){
        case 1:
            if(contains(bullet)){
                removeChild(bullet);
                bullet = null;
            }
            break;
        default:
            break;
    }
}
Но опять же столкнулся с проблемой.
Одна из функций начала выдавать ошибку
Кликните здесь для просмотра всего текста
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at game_v2_fla::MainTimeline/moveBullet()

эта функция
ActionScript 3
1
2
3
4
5
6
7
8
9
function moveBullet(e:Event):void{
    bullet.y-=speedBullet;
    if(bullet.hitTestObject(bot)){
        frag+=1;
        changeBullet();
        removeChild(bot);
        addBot();
    }
}
Не судите строго - изучаю язык всего 3 дня)))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2013, 07:35
Ответы с готовыми решениями:

Удаление мувиков со сцены
Такая проблема: Есть мувик фона игры типа Bg1_lvl_1_1. На этом фоне расположено несколько мувиков типа Platform_box и Platform_box_2...

Изменение свойств объекта из другой сцены
Подскажите, как при нажатии кнопки из одной сцены можно закрасить объект из другой сцены ?

Разница отображения сцены в режимах объекта и правки
Собсна вот: В Эдит режиме делал, делал и обнаружил, что в обычном режиме вот такая хрень. Как сделать чтобы было так как в Эдит...

11
 Аватар для Theoryofgames
254 / 238 / 50
Регистрация: 20.12.2011
Сообщений: 707
14.11.2013, 08:08
Цитата Сообщение от DEMONSTR Посмотреть сообщение
Вроде бы всё впорядке - объект со сцены удаляется, но не всё так просто. объект на самом деле не удаляется, а как будто просто становится невидимым.
это ожидаемое поведение объекта
Для того, чтобы полностью удалить объект необходимо написать внутри класса деструктор (если он, конечно требуется) и в момент удаления экземпляра класса вызвать деструктор. Деструктор остановит запущенные таймеры, почистит установенные слушатели, изменит необходимые статические переменные, вобщем сделает все то, что вы хотите, чтобы выполнилось в момент удаления экземпляра.
ActionScript 3
1
2
3
4
5
6
if(contains(bullet))
{
  removeChild(bullet); // удаление экземпляра класса со сцены
  bullet.destroy(); // вызов деструктора (название можете менять в зависимости от вашего вкуса)
  bullet = null; // удаление ссылки на экземпляр класса
}
В случае же с ошибкой функции проблема заключается в том, что после удаления ссылки на экземпляр класса
ActionScript 3
1
bullet = null;
происходит ошибка вот в этом месте
ActionScript 3
1
if(bullet.hitTestObject(bot))
так как он пытается вызвать метод ссылаясь на пустое место
Дабы избежать этого нужно либо не вызывать эту функцию вообще (если нет нужной ссылки на экземпляр класса)
либо сделать проверку непосредственно в функции
ActionScript 3
1
if(bullet && bullet.hitTestObject(bot))
1
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
14.11.2013, 21:37  [ТС]
Спасибо. С удалением разобрался
Подскажите теперь пожалуйста, как после удаления вернуть объект на сцену?
И вообще - может есть легче способ убрать объект со сцены а потом вернуть?

Добавлено через 10 минут
Для полноты картины: bullet и bot - это пуля и враг соответсвенно. при попадании пули во врага - она должна убраться( а не лететь дальше). затем при нажатии мыши должны вылетать новая пуля. Вот как бы этот "круговорот пуль" я и прошу помочь мне разобрать))
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
14.11.2013, 21:50
DEMONSTR, учитывая, что кол-во пуль не известно, есть несколько подходов:
1) При окончании движения пули удалять ее совсем
2) Использовать стек с пулями. При необходимости удаляем ее со сцены и помещаем в стек, при необходимости создаем и помещаем на сцену/в стек, при необходимости убираем со сцены и помещаем в стек.
0
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
14.11.2013, 22:05  [ТС]
TanaTiX, а не могли бы скинуть ссылчку где про стек этот почитать можно?
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
14.11.2013, 22:08
DEMONSTR, да я на каком-то форуме в обсуждениях читал. Там самое главное суть понять, а реализовать не так сложно, как кажется.

Добавлено через 33 секунды
DEMONSTR, вам для начала, что бы разобраться, и 1-го варианта должно хватить.
0
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
14.11.2013, 22:13  [ТС]
TanaTiX, так в том то и дело что я удаляю совсем
ActionScript 3
1
bullet = null;
а потом незнаю как заново создать...

Добавлено через 1 минуту
могу скинуть код целиком, если это упростит понимание проблемы))))
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
14.11.2013, 22:18
Целиком не нужно, только относящийся к проблеме. Можно дополнить небольшим тестовым проектом.
0
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
14.11.2013, 22:28  [ТС]
вообщем вот
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var bullet:MovieClip= new mc_bullet; //создается такая переменная в самом начале
 
//слушателем при нажатии вызывается addBullet
stage.addEventListener(Event.ENTER_FRAME, moveShip);
function moveShip(e:Event):void{
    Mouse.hide();
    ship.x=mouseX;
    ship.y=mouseY;
    //e.updateAfterEvent();
    stage.addEventListener(MouseEvent.MOUSE_DOWN, addBullet);
}
 
//котрая и добавляет пулю на сцену
function addBullet(e:MouseEvent):void{
    addChild(bullet);
    bullet.x=ship.x;
    bullet.y=ship.y;
    bullet.addEventListener(Event.ENTER_FRAME, moveBullet);
}
 
//соответсвенно функция движения пули
function moveBullet(e:Event):void{
    bullet.y-=speedBullet;
    if(bullet && bullet.hitTestObject(bot)){
        frag+=1;
        changeBullet();
        removeChild(bot);
        addBot();
    }
}
 
//и функция изменения состояния пули
function changeBullet():void{
    switch(bulletType){
        case 1:
            if(contains(bullet)){
                removeChild(bullet);
                bullet = null;
            }
            break;
        default:
            break;
    }
}
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
14.11.2013, 22:59
Разбираем
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var bullet:MovieClip= new mc_bullet; //создается один экземпляр класса пули
 
stage.addEventListener(Event.ENTER_FRAME, moveShip);
function moveShip(e:Event):void{//в каждом кадре скрываем мышь, перемещаем корабль и подписываемся на клик. Зачем в каждом кадре подписываться на клик и скрывать мышь?
    Mouse.hide();
    ship.x=mouseX;
    ship.y=mouseY;
    //e.updateAfterEvent();
    stage.addEventListener(MouseEvent.MOUSE_DOWN, addBullet);
}
 
//котрая и добавляет пулю на сцену
function addBullet(e:MouseEvent):void{//при клике добавляем ранее созданный экземпляр класса (см. 1ю строчку)
    addChild(bullet);
    bullet.x=ship.x;
    bullet.y=ship.y;
    bullet.addEventListener(Event.ENTER_FRAME, moveBullet);//на каждую пулю вешаем листенер. Зачем на каждую, если хватит глобального слушателя?
}
 
//соответсвенно функция движения пули
function moveBullet(e:Event):void{
    bullet.y-=speedBullet;
    if(bullet && bullet.hitTestObject(bot)){
        frag+=1;
        changeBullet();//правильней было бы назвать removeBullet
        removeChild(bot);
        addBot();
    }
}
 
//и функция изменения состояния пули
function changeBullet():void{
    switch(bulletType){
        case 1:
            if(contains(bullet)){
                removeChild(bullet);
                bullet = null;
            }
            break;
        default:
            break;
    }
}
Теперь разбираем еще.
Создание экземпляра класса сопровождается еще 2мя скобками. Классы принято называть с большой буквы.
Далее есть ссылка на один экземпляр класса пули (см. 1ю строчку), а создаваться их может хз сколько. Т.е. необходимо иметь ссылки на все пули (хэш/массив) и то, что касается одного объекта (пули) адаптировать под все + работа с их хранилищем.
0
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
14.11.2013, 23:11  [ТС]
TanaTiX, много всего рассказал, но я что то запутался. Можешь прямо указать где и что доработать и как доработать?))
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
15.11.2013, 00:30
DEMONSTR, самое главное не должна быть одна ссылка на пулю. Или их совокупность (проще), или способ динамического получения ссылки на объект.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2013, 00:30
Помогаю со студенческими работами здесь

Unity 2D. Движение объекта в пределах сцены ( андроид )
Добрый день! Есть сцена с размерами 1280 * 800, есть объект, который движется от края к краю сцены используя вот такой код: ...

Удаление объектов со сцены
Привет! Есть сцена, на ней клонируются объекты. Нужно: при нажатию левой кнопки по объекту, удалить этот объект. Пробовал вот таким...

Удаление объектов из списка и удаление самого объекта
Здраствуйте! Возник такой вопрос, допустим имеется структура данных (неважно, будь то словарь или список, пусть в данном случае будет...

Как сделать камеру дочерним объектом после создания другого объекта, или отображение сцены после создания самой камеры?
Есть кнопка при нажатии на неё создается куб ( с помощью Instantiate) как сделать камеру дочерним объектом после того как создался куб на...

Удаление объекта ef 6.0
Добрый день! У меня есть 2 класса, которые имеют связь один ко многим, есть бд, использую entity fraemwork 6.0 сущности такие: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru