![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Добрый день дамы и господа. Помогите пожалуйста разрешить мне маленькую проблемку. Я в АС3 новичёк, поэтому возможна моя беда вам покажется смешной, однако я уже отсчялся совсем, и пришел к вам за помощью. Значит так:
Флешка, представляет собой следующее: В рут из библиотеки добавляется клим Welcom, в котором создается CheckBox и Button. По нажатию на кнопку, положение CheckBox.selected записывается в SharedObject, клип удаляется и добавляется другой. При повторном запуске, если чек бокс был выставлен, то сразу вызывается метод, который происходил по нажатию кнопки, после записи в Shared object, и выполнение метода прерывается. Так вот если чек бокс небыл выставлен, то все работает отлично, но если был, то выскакивает ошибка: TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null". В методе skipWelcome(), parent ровняется null, однако this как и нужно = welcome. В чем проблема расскажите пожалуйста. Собственно код, главный её класс: package com.flashgangsta { import flash.display.MovieClip; import flash.display.Sprite; public class Main extends Sprite { private var welcome:MovieClip; public function Main() { var welcome:MovieClip = new Welcome(); addChild(welcome); } } } package com.flashgangsta { import flash.display.MovieClip; import fl.controls.Button; import fl.controls.CheckBox; import flash.net.SharedObject; import flash.events.Event; import flash.events.MouseEvent; public class Welcome extends MovieClip { private var skip:Button = new Button(); private var dontShowAgain:CheckBox = new CheckBox(); private var sharedObject:SharedObject = SharedObject.getLocal("skipWelcom"); public function Welcome() { if(sharedObject.data.dontShowAgain) { skipWelcome(); // Вот тут возникает ошибка return; } dontShowAgain.label = "Не показывать в следующий раз"; dontShowAgain.width = 202; dontShowAgain.selected = false; dontShowAgain.x = 300; dontShowAgain.y = 505; dontShowAgain.useHandCursor = true; addChild(dontShowAgain); skip.label = "Пропустить заставку" skip.width = 190; skip.x = 305; skip.y = 533; skip.useHandCursor = true; addChild(skip); skip.addEventListener(MouseEvent.CLICK, onSkipClicked); this.addEventListener(Event.ENTER_FRAME, checkMoviePlayingProgress); } private function onSkipClicked(event:Object):void { recordSharedObject(); skip.removeEventListener(MouseEvent.CLICK, onSkipClicked); skipWelcome(); } private function recordSharedObject():void { sharedObject.data.dontShowAgain = dontShowAgain.selected; sharedObject.flush(); } private function skipWelcome():void { parent.addChild(new EastingStartMenu()); //parent = null parent.removeChild(this); //parent = null } } }
__________________
Убейте меня! Последний раз редактировалось джонатан; 13.06.2010 в 22:14. |
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Вы обращаетесь к parent, еще в конструкторе, т.е. до добавления Welcom в Main.
Последний раз редактировалось udaaff; 13.06.2010 в 22:22. |
|
|||||
|
Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
|
package com.flashgangsta { import flash.display.MovieClip; import fl.controls.Button; import fl.controls.CheckBox; import flash.net.SharedObject; import flash.events.Event; import flash.events.MouseEvent; public class Welcome extends MovieClip { private var skip:Button = new Button(); private var dontShowAgain:CheckBox = new CheckBox(); private var sharedObject:SharedObject = SharedObject.getLocal("skipWelcom"); public function Welcome() { if (stage) init(); else addEventlistener(Event.ADDED_TO_STAGE,init); } private function init(event:Event=null):void { removeEventListener(Event.ADDED_TO_STAGE,init); if(sharedObject.data.dontShowAgain) { skipWelcome(); return; } dontShowAgain.label = "Не показывать в следующий раз"; dontShowAgain.width = 202; dontShowAgain.selected = false; dontShowAgain.x = 300; dontShowAgain.y = 505; dontShowAgain.useHandCursor = true; addChild(dontShowAgain); skip.label = "Пропустить заставку" skip.width = 190; skip.x = 305; skip.y = 533; skip.useHandCursor = true; addChild(skip); skip.addEventListener(MouseEvent.CLICK, onSkipClicked); this.addEventListener(Event.ENTER_FRAME, checkMoviePlayingProgress); } private function onSkipClicked(event:Object):void { recordSharedObject(); skip.removeEventListener(MouseEvent.CLICK, onSkipClicked); skipWelcome(); } private function recordSharedObject():void { sharedObject.data.dontShowAgain = dontShowAgain.selected; sharedObject.flush(); } private function skipWelcome():void { parent.addChild(new EastingStartMenu()); parent.removeChild(this); } } } Последний раз редактировалось easy.proger; 13.06.2010 в 22:26. Причина: очепятки |
|
|||||
|
Вы имеетее ввиду который находится на stage? Так ведь welcom на нем находится, он добавляется из главного класса:
А проверка происходит уже в его конструкторе (Welcome). Update: easy.proger, спасибо большое, все заработало, теперь я понял в чем беда была, буду иметь ввиду. З.Ы. если вдруг наглянет администрация, возьмите на заметку, что в новой опере, невозможно не редактировать сообщение, не пользоваться кнопками вставки тегов в панели при создании топика или мессаги. Всем спасибо!
__________________
Убейте меня! Последний раз редактировалось джонатан; 13.06.2010 в 22:31. |
|
|||||
|
Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
|
Интересно, а какой по вашему должен быть парент у объекта которого нет на сцене ? или вы считаете, что добавление на сцену происходит телепатически ? Давайте проанализируем ваш код
Вы создаете объект var welcome:MovieClip = new Welcome(); при этом входите в конструктор, но ведь addChild(welcome) еще не был вызван и нас нету на сцене ! и тут же мы спрашиваем у себя кто парент, ну и кто может быть парентом у объекта которого еще нету на сцене ? конечно null, поэтому я привел код в котором мы ждем пока нас добавят на сцену после чего уже нам будет доступно и stage и parent … Последний раз редактировалось easy.proger; 13.06.2010 в 22:37. |
|
|||||
|
easy.proger, то что я писал до апдейта я не вам, после вашего примера я все понял, почему то мне не пришло в голову что конструктор выполняется после создания экземпляра класса, а казалось, что именно после того как он будет добавлен на стейдж. Извеняю, действительно глупо, и очень благодарю за помощь.
__________________
Убейте меня! |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:58. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|