空对象引用动作3

时间:2014-01-23 10:32:07

标签: actionscript-3

我做了这样的课程:

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

    }

}

我打电话给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
        {

        }

    }

}

这是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() 
        {

        }

    }

}

当我运行代码时,我收到错误:

enter image description here

我在哪里错过了一些代码?

4 个答案:

答案 0 :(得分:1)

DrawHintText()中调用函数Hint._instance.DrawHintText();不会创建类Hint的实例。

尝试使用public getter替换您的公共变量。

private static var __instance:Hint = null;

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

并删除构造函数,因为getter使其不必要。

答案 1 :(得分:0)

可能是一个愚蠢的问题,但你实际上是在某处创建Hint的实例吗? 因为只要您不new Hint() Hint._instance将为空。

答案 2 :(得分:0)

尝试类似:

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

使用:

 Hint.getInstance().drawHintText();

答案 3 :(得分:0)

使用花费一些钱的Flash Builder或Flash Develop。这是免费的。两者都会显示编译时错误,包括行号和位置文件。

同样在运行时,会显示您遇到问题的行号和.as文件。

自动完成功能还可将您的编码时间缩短至少一半。