Kaoru
Kaoru

Reputation: 2883

Null object reference actionscript 3

i make a class like this:

    package
{
    import flash.display.Sprite;
    import flash.text.TextField;

    public class Hint extends Sprite
    {
        public static var _instance:Hint = null;

        public function Hint() 
        {
            _instance = this;
        }

        public function DrawHintText():void
        {
            Const._scoreText = new TextField();
            Const._scoreTextHolder = new TextField();
            Const._highScoreText = new TextField();
            Const._highScoreTextHolder = new TextField();
            Const._timeLeft = new TextField();
            Const._timeLeftHolder = new TextField();

            Const._scoreTextHolder.textColor = 0xFFFFFF;
            Const._scoreTextHolder.x = stage.stageWidth - 350;
            Const._scoreTextHolder.y = 100;
            Const._scoreTextHolder.text = "Score: ";
            Const._scoreTextHolder.selectable = false;

            Const._scoreText.textColor = 0xFFFFFF;
            Const._scoreText.x = stage.stageWidth - 250;
            Const._scoreText.y = 100;
            Const._scoreText.text = "--";
            Const._scoreText.selectable = false;

            Const._highScoreTextHolder.textColor = 0xFFFFFF;
            Const._highScoreTextHolder.x = stage.stageWidth - 350;
            Const._highScoreTextHolder.y = 150;
            Const._highScoreTextHolder.text = "High Score: ";
            Const._highScoreTextHolder.selectable = false;

            Const._highScoreText.textColor = 0xFFFFFF;
            Const._highScoreText.x = stage.stageWidth - 250;
            Const._highScoreText.y = 150;
            Const._highScoreText.text = "--";
            Const._highScoreText.selectable = false;

            Const._timeLeftHolder.textColor = 0xFF0000;
            Const._timeLeftHolder.x = stage.stageWidth - 350;
            Const._timeLeftHolder.y = 200;
            Const._timeLeftHolder.text = "Time Left: ";
            Const._timeLeftHolder.selectable = false;

            Const._timeLeft.textColor = 0xFF0000;
            Const._timeLeft.x = stage.stageWidth - 275;
            Const._timeLeft.y = 200;
            Const._timeLeft.text = "00:00";
            Const._timeLeft.selectable = false;

            addChild(Const._scoreText);
            addChild(Const._scoreTextHolder);
            addChild(Const._highScoreText);
            addChild(Const._highScoreTextHolder);
            addChild(Const._timeLeft);
            addChild(Const._timeLeftHolder);
        }

    }

}

and i called on the GameManager:

   package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;


    [SWF(width='1366',height='768',backgroundColor='#000000',frameRate='30')]

    public class GameManager extends Sprite
    {

        public function GameManager():void
        {
            DrawHintText();
            GenerateField();
            ShowField();
            GenerateGems();
        }

        private function GenerateField():void
        {
            Const._gridField = new Array();

            for (var i:uint = 0; i < Const._gridSizeY; i++)
            {
                Const._gridField[i] = new Array();

                for (var j:uint = 0; j < Const._gridSizeX; j++)
                {
                    Const._gridField[i][j] = 0;
                }
            }
        }

        private function ShowField():void
        {
            Const._fieldSprite = new Sprite();
            addChild(Const._fieldSprite);
            Const._fieldSprite.graphics.lineStyle(1, 0xFFFFFF);

            for (var i:uint = 0; i < Const._gridSizeY; i++)
            {
                for (var j:uint = 0; j < Const._gridSizeX; j++)
                {
                    Const._fieldSprite.graphics.beginFill(0x666666);
                    Const._fieldSprite.graphics.drawRect(25 + 65 * j, 80 + 60 * i, 65, 60);
                    Const._fieldSprite.graphics.endFill();
                }
            }
        }

        private function DrawHintText():void
        {
            Hint._instance.DrawHintText();
        }

        private function GenerateGems():void
        {

        }

    }

}

and here is the Const:

package
{
    import flash.display.Sprite;
    import flash.text.TextField;

    public class Const 
    {
        public static var _gridField:Array;

        public static var _fieldSprite:Sprite;

        public static var _scoreText:TextField;
        public static var _scoreTextHolder:TextField;
        public static var _highScoreText:TextField;
        public static var _highScoreTextHolder:TextField;
        public static var _timeLeft:TextField;
        public static var _timeLeftHolder:TextField;

        public static const _gridSizeX:Number = 10;
        public static const _gridSizeY:Number = 10;

        public function Const() 
        {

        }

    }

}

when i run the code, i got the error:

enter image description here

Where do i miss some code?

Upvotes: 0

Views: 70

Answers (4)

Discipol
Discipol

Reputation: 3157

Use Flash Builder, which costs some money, or Flash Develop. which is free. Both will show you compile time errors, with line numbers and location file.

Also at runtime will show you line number and the .as file where you have the problem.

Also autocomplete cuts your coding time by at least half time.

Upvotes: 0

Petr Hrehorovsky
Petr Hrehorovsky

Reputation: 1153

Invoking function DrawHintText() in Hint._instance.DrawHintText(); doesn't create instance of class Hint.

Try to substite your public variable with public getter.

private static var __instance:Hint = null;

public static function get _instance():Hint {
    if (!__instance) {
        __instance = new Hint();
    }
    return __instance;
}

And drop constructor, because getter makes it unnecessary.

Upvotes: 1

gabriel
gabriel

Reputation: 2359

Try something like:

public class Hint extends Sprite
{
    private static var _instance:Hint;

    public function Hint()
    {
        if (_instance) throw new Error("Hint... use getInstance()");
        _instance = this;
    }

    public static function getInstance():Hint
    {
        if (!_instance) new Hint();
        return _instance;
    }

    //DrawHintText >> rename to drawHintText
    public function drawHintText():void
    {
        //your code here
    }
}

And to use:

 Hint.getInstance().drawHintText();

Upvotes: 0

3vilguy
3vilguy

Reputation: 981

Might be a silly question, but are you actually creating instance of Hint somewhere? Because as long as you don't do new Hint() that Hint._instance will be null.

Upvotes: 0

Related Questions