TypeError: Ошибка № 1009 в AS3 flash cs6

У меня есть эта ошибка при работе с моей вспышкой:

TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу нулевой ссылки на объект. в опциях()

Это мой класс параметров:

    package  {

    import flash.display.MovieClip;
    import fl.managers.StyleManager;
    import flash.text.TextFormat;
    import fl.events.ComponentEvent;
    import fl.events.*;
    import flash.events.MouseEvent;
    import fl.controls.*;
    import flash.net.SharedObject;
    import flash.events.Event;

    public class Options extends MovieClip
    {
        //DECLARE CLASS VARIABLES//
        //DECLARE COMPONENT VARIABLES
        private var cComponentFmt:TextFormat;
        //DECLARE SAVE DATA VARIABLES
        private var cPlayerData:Object;
        private var cSavedGameData:SharedObject;
        //DECLARE SOUND VARIABLES

        public function Options()
        {
            //created the SharedObject using the getLocal() function
            cSavedGameData = SharedObject.getLocal("savedPlayerData");
            //set component formats
            setComponents();
            //initialize player's data
            setPlayerData();
            //set default message display upon entering the setup page
            msgDisplay.text = "Introduce yourself to the fellow minions!";
            //add event listeners
            nameBox.addEventListener(MouseEvent.CLICK, clearName);
            nameBox.addEventListener(ComponentEvent.ENTER, setName); 
        }

        private function setComponents():void
        {
            //set the TextFormat for the components
            cComponentFmt = new TextFormat();
            cComponentFmt.color = 0x000000; //black colour
            cComponentFmt.font = "Comic Sans MS"; //set default "Comic Sans MS"
            cComponentFmt.size = 16;
            //apply the new TextFormat to ALL the components
            StyleManager.setStyle("textFormat", cComponentFmt);
        }

        private function setName(evt:ComponentEvent):void
        {
            trace("Processing text input box..");
            // player pressed the ENTER key
            cPlayerData.pName = nameBox.text;
            msgDisplay.text = "Welcome, " + cPlayerData.pName + "! \nEnjoy many hours of fun with us!";
            saveData();
        }

        private function clearName(evt:MouseEvent):void 
        {
            // player CLICKED in the nameBox
            nameBox.text = "";
        }

        private function setPlayerData():void
        {
            //all variables that relate to the player
            cPlayerData = new Object();
            //options related variables
            cPlayerData.pName = "Papoi";
            cPlayerData.sndTrack = "none";
            //game related variables
            cPlayerData.pScore = 0;
            //save the player's data
            saveData();
        }

        private function saveData():void
        {
            //savedPlayerData = cPlayerData is the name=value pair
            cSavedGameData.data.savedPlayerData = cPlayerData;
            //force Flash to update the data
            cSavedGameData.flush();
            //reload the newly saved data
            loadData();
        }

        private function loadData():void 
        {
            //gets the data stored in the SharedObject
            //this particular line not found in the options.as
            cSavedGameData = SharedObject.getLocal("savedPlayerData","/",false);
            //now stores the save data in the player object
            cPlayerData = cSavedGameData.data.savedPlayerData;
        }

    }

}

Кто-нибудь знает, почему существует эта конкретная ошибка?

А также я хочу, чтобы cPlayerData.pName было «Papoi», если имя не введено в nameBox. Как мне это сделать? Потому что прямо сейчас я попытался установить для cPlayerData.pName значение «Papoi» по умолчанию, но это не сработало. Хм..


person Apple.    schedule 23.10.2013    source источник


Ответы (1)


Ваша проблема заключается в функции конструктора, поэтому, возможно, компонент «msgDisplay» и/или компонент «nameBox» еще/не полностью инициализированы, пока вы пытаетесь получить доступ к одному из его свойств... Хорошей практикой является доступ к вашим объектам только когда они полностью инициализированы, это можно сделать с помощью события «AddedToSatge», которое не будет запущено до инициализации всех дочерних элементов. Примечание: даже если это не является источником вашей проблемы, это всегда полезно делать потому что это убережет вас от других проблем и ошибок, связанных с той же проблемой.

ОБНОВЛЕНИЕ: проблема была в вашей функции loadData(), поскольку вы изменили localPath вашего SharedObject внутри тела этой функции (это не то же самое, что используется в функции saveData()), тогда ваши загруженные данные всегда будут нулевыми, и это было то, что вы см. в сообщении об ошибке. вам просто нужно удалить эту строку из функции loadData. см. мой обновленный код ниже.

package 
{
    import flash.display.MovieClip;
    import fl.managers.StyleManager;
    import flash.text.TextFormat;
    import fl.events.ComponentEvent;
    import fl.events.*;
    import flash.events.MouseEvent;
    import fl.controls.*;
    import flash.net.SharedObject;
    import flash.events.Event;

    public class Options extends MovieClip
    {
        //DECLARE CLASS VARIABLES//
        //DECLARE COMPONENT VARIABLES
        private var cComponentFmt:TextFormat;
        //DECLARE SAVE DATA VARIABLES
        private var cPlayerData:Object;
        private var cSavedGameData:SharedObject;
        //DECLARE SOUND VARIABLES

        public function Options()
        {
            if (stage)
            {
                init();
            }
            else
            {
                addEventListener(Event.ADDED_TO_STAGE, init);
            }
        }

        public function init(e:Event = null):void
        {
            // it is important to remove it coz you don't need it anymore:
            removeEventListener(Event.ADDED_TO_STAGE, init);

            //created the SharedObject using the getLocal() function
            cSavedGameData = SharedObject.getLocal("savedPlayerData");
            //set component formats
            setComponents();
            //initialize player's data
            setPlayerData();
            //set default message display upon entering the setup page
            msgDisplay.text = "Introduce yourself to the fellow minions!";
            //add event listeners
            nameBox.addEventListener(MouseEvent.CLICK, clearName);
            nameBox.addEventListener(ComponentEvent.ENTER, setName);
        }

        private function setComponents():void
        {
            //set the TextFormat for the components
            cComponentFmt = new TextFormat();
            cComponentFmt.color = 0x000000;//black colour
            cComponentFmt.font = "Comic Sans MS";//set default "Comic Sans MS"
            cComponentFmt.size = 16;
            //apply the new TextFormat to ALL the components
            StyleManager.setStyle("textFormat", cComponentFmt);
        }

        private function setName(evt:ComponentEvent):void
        {
            trace("Processing text input box..");
            // player pressed the ENTER key

            // remove the whitespace from the beginning and end of the name: 
            var playerNameWithoutSpaces:String = trimWhitespace(nameBox.text);
            // check if the user did not enter his name then default name is "Papoi":
            if (playerNameWithoutSpaces == "")
            {
                cPlayerData.pName = "Papoi";
            }
            else
            {
                cPlayerData.pName = nameBox.text;
            }

            //// This will replace the default message :
            //// msgDisplay.text =  "Welcome, " + cPlayerData.pName + "! \nEnjoy many hours of fun with us!";
            // This will add the welcome message to the default message :
            msgDisplay.text +=  "\nWelcome, " + cPlayerData.pName + "! \nEnjoy many hours of fun with us!";
            saveData();
        }

        private function clearName(evt:MouseEvent):void
        {
            // player CLICKED in the nameBox
            nameBox.text = "";
        }

        private function setPlayerData():void
        {
            //all variables that relate to the player
            cPlayerData = new Object();
            //options related variables
            cPlayerData.pName = "Papoi";
            cPlayerData.sndTrack = "none";
            //game related variables
            cPlayerData.pScore = 0;
            //save the player's data
            saveData();
        }

        private function saveData():void
        {
            //savedPlayerData = cPlayerData is the name=value pair
            cSavedGameData.data.savedPlayerData = cPlayerData;
            //force Flash to update the data
            cSavedGameData.flush();
            //reload the newly saved data;
            loadData();
        }

        private function loadData():void
        {
            //gets the data stored in the SharedObject
            //this particular line not found in the options.as

            //// delete the next line, no need to set it every time : 
            //// cSavedGameData = SharedObject.getLocal("savedPlayerData","/",false);

            //now stores the save data in the player object
            cPlayerData = cSavedGameData.data.savedPlayerData;
        }
        //────────────────────────────────────────────
        private function trimWhitespace($string:String):String
        {
            if ($string == null)
            {
                return "";
            }
            return $string.replace(/^\s+|\s+$/g, "");
        }
        //────────────────────────────────────────────
    }
}
person Amer    schedule 23.10.2013
comment
Хм, я попытался изменить свои коды на тот, который вы предложили, но в нем все еще есть ошибки, TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на нулевой объект. at Options/init() at Options() TypeError : Ошибка № 1009: невозможно получить доступ к свойству или методу нулевой ссылки на объект. в Options/setName() в flash.events::EventDispatcher/dispatchEventFunction() в flash.events::EventDispatcher/dispatchEvent() в fl.controls::TextInput/handleKeyDown() все эти ошибки TypeError. - person Apple.; 23.10.2013
comment
Кроме того, я только что обновил свои коды выше для загрузки и сохранения данных. Я не уверен, связано ли это с ошибкой... Хм... - person Apple.; 23.10.2013
comment
Чтобы получить дополнительную информацию об ошибках, например номер строки ошибки, который очень полезен в большинстве ситуаций, вам следует включить параметр «Разрешить отладку» в меню «Файл» > «Параметры публикации» > «Flash (.swf)» > «Дополнительно» > «Разрешить отладку», как показано на этом рисунке: i.stack.imgur.com/EHgtK.jpg , это поможет нам определить вашу ошибку Быстрее. - person Amer; 23.10.2013
comment
Ооо, коды рабочие, но не полностью. Работает частично, потому что прямо сейчас, когда я ввожу имя в nameBox, оно генерирует сообщение на дисплее сообщений. Однако по умолчанию отображается сообщение «Представься другим миньонам»! все еще не появляется :/ Хм.. - person Apple.; 24.10.2013
comment
У него есть эта ошибка: TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу нулевой ссылки на объект. в Параметры/инициализация() в Параметры() - person Apple.; 24.10.2013
comment
сообщение по умолчанию исчезает, потому что вы заменяете свойство text msgDisplay в своей функции setName, устанавливая для него новое значение: msgDisplay.text = ...; если вы хотите сохранить это сообщение по умолчанию при добавлении нового приветственного текста, вы должны заменить эту строку на эту: msgDisplay.text += "\nWelcome, " + cPlayerData.pName + "! \nEnjoy many hours of fun with us!"; - person Amer; 24.10.2013
comment
Пожалуйста, я только что обновил свой код, чтобы вы могли проверить и указать значение имени по умолчанию Papoi, если пользователь не ввел свое имя. - person Amer; 24.10.2013