错误:通过带有静态类型Class的引用调用可能未定义的方法crearNotaS

时间:2014-11-23 01:23:23

标签: actionscript-3

我是编程新手,我正在为我的职业生涯做一个“迷你游戏”。

我收到此错误,希望有人可以帮助我。

    public class Notas
{
    public var stage:Stage;
    public var velocidad:int =  5;

    public var i:int = 0;
    public var notaS:Array = new Array(16);
    public var notaD:Array = new Array(16);

    public function Notas(escenario:Stage)
    {
        stage = escenario;
    }

    public function Inicializar():void
    {
        crearNotaS(0xFFFFFF, 30, 10, 0, 0);
    }

    public function Destruir():void
    {
        if (notaS[i].y < 720)
        {
            for (i = 0; i < notaS.length; i++)
            {
                stage.removeChild(notaS[i])
            }
        }
    }

    public function Mover():void
    {
        notaS[i].y += velocidad;
    }

    public function drawRect(color:uint, ancho:int, alto:int, x:int, y:int):Sprite
    {
        var dj:Sprite = new Sprite();

        dj.graphics.beginFill(color,1);
        dj.graphics.drawRect(0,0,ancho,alto);
        dj.graphics.endFill();

        dj.x = x;
        dj.y = y;

        return(dj);
    }

    public function asignarNotas():void
    {
        notaS[0] = 1
    }

    public function crearNotaS(color:int, ancho:int, alto:int, x:int, y:int):void
    {
        var contador:int = 0;

        for (i = 0; i < notaS.length; i++)
        {
            if (notaS[i] == 1 && i == 0)
            {
                notaS[i] = drawRect(color, ancho, alto, x, y);
                stage.addChild(notaS[i]);
                notaS[i].y = -alto / 2;
            }

            else if (notaS[i] == 1 && i > 0)
            {
                for (j = i; j < notaS.length; j++)
                {
                    contador = i - j

                    notaS[i] = drawRect(color, ancho, alto, x, notaS[j].y + alto * contador);
                    stage.addChild(notaS[i]);
                    return;
                }
            }
        }
    }
}

它应该创建一个正方形数组(只有当索引的内容是1时,如果它是0那么它就不会在那里创建正方形。)一个在彼此之上,然后将它们全部移动像吉他英雄一样。

我这样做的方式可能并不合适,但这是我自己做的第一件事......

1 个答案:

答案 0 :(得分:0)

ActionScript是一种面向对象的语言。类也应该是对象,当你想要访问它们的方法时,你需要首先创建它们的实例,或者确保目标函数的类型是&#34;静态&#34;,它有自己的局限性。 这完全是关于在运行代码之前需要了解的核心概念。我建议看一些有关课程的教程。这可能是一个好的开始: Tutorial: Understanding Classes in AS3 Part 1

但关于你的代码。它错过了一些导入和变量定义,但不是一个主要的缺陷。我能够运行你的代码。我将附加一个包含我创建的AS3 AIR项目的zip文件来测试代码:Test Project

您可以通过以下几个步骤自行完成此操作:

  1. 在您选择的IDE中创建一个As3项目。 (我使用FlashDevelop)
  2. 声明包含类
  3. 实例的YourClass(Notas)类型的变量
  4. 在使用您的类的函数之前,创建一个类的实例并将其存储在变量中。
  5. viola,通过访问您创建的变量来使用您的类的公共方法和属性。
  6. 这是主要功能:

    package 
    {
        import flash.display.Sprite;
        /**
         * ...
         * @author tkiafar
         */
        public class Main extends Sprite 
        {
            private var _not:Notas;
            public function Main():void 
            {
                if (stage) {
                    _not = new Notas(this.stage);
                    _not.asignarNotas();
                    _not.Inicializar();
                }
            }
    
        }
    
    }
    

    这是你的类,它位于主包中(在main.as旁边):

    package
    {
        import flash.display.Sprite;
        import flash.display.Stage;
    
        public class Notas
        {
            public var stage:Stage;
            public var velocidad:int = 5;
    
            public var i:int = 0;
            public var j:int = 0;
            public var notaS:Array = new Array(16);
            public var notaD:Array = new Array(16);
    
            public function Notas(escenario:Stage)
            {
                stage = escenario;
            }
    
            public function Inicializar():void
            {
                crearNotaS(0xFF00FF, 30, 10, 0, 0);
            }
    
            public function Destruir():void
            {
                if (notaS[i].y < 720)
                {
                    for (i = 0; i < notaS.length; i++)
                    {
                        stage.removeChild(notaS[i])
                    }
                }
            }
    
            public function Mover():void
            {
                notaS[i].y += velocidad;
            }
    
            public function drawRect(color:uint, ancho:int, alto:int, x:int, y:int):Sprite
            {
                var dj:Sprite = new Sprite();
    
                dj.graphics.beginFill(color, 1);
                dj.graphics.drawRect(0, 0, ancho, alto);
                dj.graphics.endFill();
    
                dj.x = x;
                dj.y = y;
    
                return (dj);
            }
    
            public function asignarNotas():void
            {
                notaS[0] = 1
            }
    
            public function crearNotaS(color:int, ancho:int, alto:int, x:int, y:int):void
            {
                var contador:int = 0;
    
                for (i = 0; i < notaS.length; i++)
                {
                    if (notaS[i] == 1 && i == 0)
                    {
                        notaS[i] = drawRect(color, ancho, alto, x, y);
                        stage.addChild(notaS[i]);
                        notaS[i].y = -alto / 2;
                    }
                    else if (notaS[i] == 1 && i > 0)
                    {
                        for (j = i; j < notaS.length; j++)
                        {
                            contador = i - j
    
                            notaS[i] = drawRect(color, ancho, alto, x, notaS[j].y + alto * contador);
                            stage.addChild(notaS[i]);
                            return;
                        }
                    }
                }
            }
        }
    
    }
    

    毕竟我有一些建议:

    • 分隔包含控制索引的数组和包含sprite的数组。
    • 避免公开变量。在您的情况下,不需要在课堂外访问它们,但如果您需要使它们可访问,请使用getter / setter。 google&#34; get3 / setter in as3&#34;。
    • 发明自己的一些命名标准。 google&#34;在as3&#34;中命名的规则。