TypeError: Error #1009 in AS3 flash cs6

两盒软妹~` 提交于 2019-12-13 09:23:09

问题


I have got this error while working on my flash:

TypeError: Error #1009: Cannot access a property or method of a null object reference. at Options()

This is my Options class:

    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;
        }

    }

}

Does anyone know why this particular error exists?

And also, I want to make the cPlayerData.pName to be "Papoi" if a name is not entered in the nameBox. How am I to make that happen? Cuz right now, I tried by setting the cPlayerData.pName to "Papoi" by default, but it doesn't work. Hmm..


回答1:


Your problem is in the constructor function so maybe the component “msgDisplay” and/or the component “nameBox” are/is not initialized completely yet while you are trying to access one of its properties... A good practice is to access your objects only when they are fully initialized, that can be done using the event “AddedToSatge” which will not be fired before all children’s are initialized.. Note: even if it is not the source of your problem, it is a good thing to do always because it will save you from other problems and bugs related to the same issue.

UPDATE: The problem was in your loadData() function, because you have changed the localPath of your SharedObject inside that function body (it is not the same as used in saveData() function), then your loaded data will always be null, and that was what you see in the error message. you just need to delete that line from loadData function. see my updated code below.

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, "");
        }
        //────────────────────────────────────────────
    }
}


来源:https://stackoverflow.com/questions/19547219/typeerror-error-1009-in-as3-flash-cs6

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!