Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85

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

14.11.2013, 07:35. Показов 3323. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru