-1

我在使用闪存时遇到此错误:

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

    }

}

有谁知道为什么存在这个特定错误?

而且,如果没有在 nameBox 中输入名称,我想让 cPlayerData.pName 成为“Papoi”。我要如何做到这一点?因为现在,我尝试将 cPlayerData.pName 默认设置为“Papoi”,但它不起作用。唔..

4

1 回答 1

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, "");
        }
        //────────────────────────────────────────────
    }
}
于 2013-10-23T18:06:16.930 回答