С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
1

RemoveEvent в классе: TypeError: Error #1009: Cannot access a property or method of a null object reference

14.05.2014, 16:48. Просмотров 803. Ответов 17
Метки нет (Все метки)

Есть класс объекта, в основном классе создается 6 объектов этого класса. Есть ф-ция, которая по таймеру удаляет слушатель, но слушатель удаляется у всех объектов, а надо чтобы удалился только у того, на который наводим мышью
ActionScript 3
1
2
3
private var bg_mob:MovieClip;
 
bg_mob.addEventListener(Event.ENTER_FRAME, mob_obzor);
Это слушатель

ActionScript 3
1
2
3
4
5
6
7
8
private function _sheremob_del(ev:TimerEvent):void
        {
            
            tm_info.stop();
            bg_mob = ev.currentTarget as MovieClip;
            bg_mob.removeEventListener(Event.ENTER_FRAME, mob_obzor);
            
        }
Это собственно удаление слушателя. Но по истечению таймера, вроде как слушатель удаляется у этого объекта, но вызывается ошибка
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Как исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2014, 16:48
Ответы с готовыми решениями:

Ошибка [Fault] exception, information=TypeError: Error #1009: Cannot access a property or method of a null object reference
Есть Библиотека fl_package.swc. Среда Flash Develop Код: ... import...

Cannot access a property or method of a null object reference для TextField в классе
private var text_dialog:MovieClip; text_dialog = new bg_dialog();...

Cannot access a property or method of a null object reference
TanaTiX, огромное спасибо! Но есть ещё один вопрос var js = "window.ret =...

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null"
Имеется пакет сделанный на Adobe Flash Builder (AFB), создан 1 класс и...

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
Здравствуйте, все сделала по уроку, но у меня выдает ошибку "null". Подскажите...

17
Theoryofgames
253 / 237 / 50
Регистрация: 20.12.2011
Сообщений: 707
14.05.2014, 17:08 2
Цитата Сообщение от MrDead Посмотреть сообщение
bg_mob = ev.currentTarget as MovieClip;
Как у события таймера текущей целью может быть MovieClip? Приведите код, где вы подписываетесь на данное событие.
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 17:13  [ТС] 3
ActionScript 3
1
2
tm_info = new Timer(2000);
tm_info.addEventListener(TimerEvent.TIMER, _sheremob_del);
0
Theoryofgames
253 / 237 / 50
Регистрация: 20.12.2011
Сообщений: 707
14.05.2014, 17:27 4
Ваша проблема в том, что Вы не используете ООП - многие вопросы отпали бы сразу.
Цитата Сообщение от MrDead Посмотреть сообщение
ActionScript 3
1
tm_info = new Timer(2000); tm_info.addEventListener(TimerEvent.TIMER, _sheremob_del);
Почему вы считаете, что currentTarget для события таймера должен стать некий моб, ведь у Вас таймер никак не связан с ним. В Вашем случае для каждого моба нужно создавать отдельный таймер, который будет следить за ним.
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 19:12  [ТС] 5
Так если я добавляю на сцену несколько экземлпяров класса, разве у них не должен быть свой таймер? То есть если я навожу мышкой на моба, то удалится должен его таймер, ведь я навел мышью конкретно на него, а не на других аналогичных...Ведь я не создаю для каждого таймер, чтобы отобразился именно этого моба круг обзора, он отображается правильно, конкретного у того моба, на которого кликнул, а не у всех разом
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
14.05.2014, 19:15 6
MrDead, таймер - это отдельный объект. Он никак не связан с объектом сцены, если ттолько вы эту связь не наладите. Например, таймер можно поместить в объект сцены.
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 19:25  [ТС] 7
Ок. Допустим я сделаю так
ActionScript 3
1
addEventListener(Event.ENTER_FRAME, mob_obzor);
ActionScript 3
1
2
3
4
5
6
7
private function _sheremob_del(ev:TimerEvent):void
        {
            removeEventListener(Event.ENTER_FRAME, mob_obzor);
            trace("Удалили слушатель");
            tm_info.stop();
            
        }
Почему слушатель не удаляется и ф-ция mob_obzor продолжает работать у объекта класса?
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
14.05.2014, 19:34 8
MrDead, вы приводите не связные куски кода. У вас сам метод _sheremob_del срабатывает? Подписка на слушатель и отписка осуществляются в пределах одного объекта?
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 19:43  [ТС] 9
Да, срабатывает, если я добавлю
ActionScript 3
1
tm_info.removeEventListener(TimerEvent.TIMER, _sheremob_del);
То больше таймер не будет срабатывать, потому что его слушатель удалили, причем удаляется у того объекта, по которому навели мышкой.
Подписка на слушатель и отписка осуществляются в пределах одного объекта?
Нет, на сцене несколько объектов класса, в котором содержится данный код. Пересмотрел, код срабатывает. Но. Срабатывает только если навести на каждый объект родного класса, тогда у всех разом отключается это событие. Но мне надо чтобы отключался только у одного и только у того, на который навели мышкой. В другом месте мне сказали что нужно сделать так
ActionScript 3
1
2
  bg_mob = ev.currentTarget as MovieClip;
            bg_mob.removeEventListener(Event.ENTER_FRAME, mob_obzor);
Но как оказалось, не совсем правильно. Вернее так то код работает, если закрыть глаза на ошибку, слушатель удаляется у того моба, на которого навели мышкой, но вот сама ошибка всё фартчмачит.
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
14.05.2014, 19:50 10
Покажите минимальный пример, иллюстрирующий проблему, в виде проекта.
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 20:46  [ТС] 11
Прикрепил проект.
0
Вложения
Тип файла: rar Proect.rar (8.2 Кб, 2 просмотров)
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
14.05.2014, 21:15 12
Класс CreateMob
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package  Folder{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.events.MouseEvent;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.display.Bitmap;
        import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.TextFieldType;
    public class CreateMob extends Sprite{
        //Моб
        private var bg_mob:Sprite;
        //Таймер
        private var tm_info:Timer;
        public function CreateMob() 
        {
            //Добавляем моба на сцену
            addMob();
            //Добавляем слушатели
            bg_mob.addEventListener(Event.ENTER_FRAME, mob_obzor);
            bg_mob.addEventListener(MouseEvent.MOUSE_OVER, _shere);
            
            
        }
 
//Ф-ция создания моба
        private function addMob():void
        {
            // Основное изображение моба на сцене
            bg_mob = new sprite_mob();
            bg_mob.x = 0;
            bg_mob.y = 0;
            addChild(bg_mob);
            
        }
        //Ф-ция срабатывания таймера
        private function _shere(event:MouseEvent):void
        {
            if(!tm_info){
                tm_info = new Timer(2000, 1);
                tm_info.addEventListener(TimerEvent.TIMER_COMPLETE, _sheremob_del);
                tm_info.start();
            }
            
        }
        //Ф-ция результата окончания таймера(Здесь мы удаляем слушатель того объекта, на который навели мышкой)
        private function _sheremob_del(ev:TimerEvent):void
        {
            bg_mob.removeEventListener(Event.ENTER_FRAME, mob_obzor);
            trace("Удалили слушатель");
            
        }
        //Ф0ция выводящая трейс до тех пор, пока не навели мышкой на объкт
        private function mob_obzor(ev:Event):void
        {
            //trace("Трататата");
        }
    }
    
}
Так?
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 22:50  [ТС] 13
Ничего не догоняю, этот вариант работает в тестовом проекте. А вот так

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
    private function mob_obzor(ev:Event):void
        {
    
            for (var i:uint = 0; i < main_bgplatform.mass.length; i++)
            {
                if (Point.distance(new Point(main_bgplatform.igrok.x, main_bgplatform.igrok.y), new Point(main_bgplatform.mass[i].x, main_bgplatform.mass[i].y)) < radius)
                {
                
                    main_bgplatform.mass[i].bg_mob.rotation = Math.atan2(main_bgplatform.mass[i].y - main_bgplatform.igrok.y, main_bgplatform.mass[i].x - main_bgplatform.igrok.x) * 180 / Math.PI - 90
                
            }
            }
        }
Не работает. Слушатель вроде удаляется, но моб продолжает следить за игроком. Если я всё это сотру и напишу
bg_mob.rotation += 90;
То после окончания таймера именно моб, на которого навели мышью остановится. Проблема конкретно в этом куске

ActionScript 3
1
2
3
4
5
6
for (var i:uint = 0; i < main_bgplatform.mass.length; i++)
            {
                if (Point.distance(new Point(main_bgplatform.igrok.x, main_bgplatform.igrok.y), new Point(main_bgplatform.mass[i].x, main_bgplatform.mass[i].y)) < radius)
                {
                
                    main_bgplatform.mass[i].bg_mob.rotation = Math.atan2(main_bgplatform.mass[i].y - main_bgplatform.igrok.y, main_bgplatform.mass[i].x - main_bgplatform.igrok.x) * 180 / Math.PI - 90
Но не пойму никак где косяк...
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
14.05.2014, 22:59 14
Цитата Сообщение от MrDead Посмотреть сообщение
Проблема конкретно в этом куске
Поставьте трэйсы или точки останова, проследите где именно несоответствие.
0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
14.05.2014, 23:17  [ТС] 15
Кажется понял почему так, у каждого объекта создается свой слушатель, но этот слушатель пробегается по всем элементам массива объектов, соответственно на какого-бы моба игрок не зашел, его слушатель удалится, но остальные(до тех пор пока не наведешь на каждого моба) остаются "живыми" и влияют на всех мобов в массиве. Остается теперь догнать, как исправить эту ситуацию. Вспомнил что у меня был косяк с этим и решил этот вопрос методом пробегания по всем элементам массива, однако нажил другие проблемы...Поворачивать моба прямо из родного класса не получилось, т.к. игрок и объект класса в разных системах координат. Надо как-то проверить по элементу в масиве, что конкретно у этого моба сейчас игрок и удалить его слушатель
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
15.05.2014, 00:15 16
Цитата Сообщение от MrDead Посмотреть сообщение
Надо как-то проверить по элементу в масиве, что конкретно у этого моба сейчас игрок и удалить его слушатель
Завести свойство и проверять его при необходимости?

Не по теме:

Вообще какая-то непонятная архитектура проекта...

0
MrDead
15 / 15 / 6
Регистрация: 04.03.2014
Сообщений: 153
15.05.2014, 00:23  [ТС] 17
А вот как проверить это свойство, я что-то не особо представляю...
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,007
Завершенные тесты: 2
15.05.2014, 00:50 18
Как-то так
ActionScript 3
1
if(main_bgplatform.mass[i].bg_mob.нужное_свойство==нужное_значение){
Только не забыть создать это свойство в main_bgplatform.mass[i].bg_mob
0
15.05.2014, 00:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 00:50

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null"
Помогите пожалуйста, что нужно сделать, чтобы убрать эту ошибку?

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null"
Здравствуйте! Столкнулся с такой ошибкой: Вот код:...

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null". at _fla::MainTimel
Народ, помогите, пожалуйста, что не так... stop(); var clickCounter:int = 0;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru