2015-04-23 84 views
0

我正在尝试加载背景图像,但出现错误,提示“错误:未定义属性assetLoader的访问”。这里发生了什么?AS3无法识别我刚刚声明的变量

import flash.display.Loader; 
import flash.net.URLRequest; 
class Inventory { 
    private var assetLoader:Loader = new Loader(); 
    assetLoader.load(new URLRequest("image.png")); //error on this line 
    addChild(assetLoader); 
} 

回答

3
  1. 如果您正在使用addChild()方法必须继承的DisplayObjectContainer功能。如果您将Inventory课程用作document课程,则必须延伸SpriteMovieClip

  2. 文档类必须由公共访问说明符定义。

  3. 仅全局(Class属性定义)声明的变量允许使用privatepublic。你不能在本地使用它(在函数内)。时间轴也不允许你使用访问说明符。

    package 
    { 
        import flash.display.Loader; 
        import flash.net.URLRequest; 
        import flash.display.MovieClip; 
    
        public class Inventory extends MovieClip 
        { 
         private var assetLoader:Loader; 
         public function Inventory() 
         { 
          // constructor code 
          assetLoader= new Loader(); 
          assetLoader.load(new URLRequest("image.png")); //error on this line 
          addChild(assetLoader); 
         } 
        } 
    } 
    
+0

让我为'addChild()',我没有注意到他没有继承'DisplayObjectContainer'。但是,将'assetLoader'放入构造函数中可能会误导TS而不使用类宽属性。考虑重新安排。另外,BotMaster是正确的,这个类可能不需要'public'类修饰符,但是如果你正在创建一个你可能在另一个项目中使用的类,那么使用'public'会更好。 – Vesper

+0

我做了一些改变。感谢您的意见。 – Benny

2

你需要这两条线将在构造函数中的代码,如下所示:

import flash.display.Loader; 
import flash.net.URLRequest; 
class Inventory { 
    private var assetLoader:Loader = new Loader(); 
    public function Inventory() { 
     assetLoader.load(new URLRequest("image.png")); //error on this line 
     addChild(assetLoader); 
    } 
} 
+0

修正了assetLoader.load行上的错误,但是现在我在下一行出现同样的错误。 – zzxjoanw

+0

不幸的是,我错过了您没有像接受的答案中所解释的那样继承“DisplayObjectContainer”。 – Vesper

1

正确的答案是,即使是艰难的,你可以在声明时实例化实例喜欢这里:

private var assetLoader:Loader = new Loader(); 

你不准与这些对象之前存在的类实例工作。任何尝试在创建Inventory实例之前访问assetLoader属性和方法都将失败。构造函数是Inventory的一个实例将运行的第一段代码,所以它是类代码中的第一个地方,您可以开始使用类实例对象,因为此时存在Inventory实例。 Vesper代码示例正确显示它。

在理论上这样的:

private var assetLoader:Loader = new Loader(); 

等效于此:

private var assetLoader:Loader; 

public function Inventory() 
{ 
    assetLoader = new Loader(); 
} 

但实际上assetLoader创建的定时稍有不同。在构造函数中创建这些成员实例总是更好。

对于Benny:所有类都有访问修饰符,默认为内部。 PO类定义为内部,因此正确地具有访问修饰符(由于没有指定内部缺省值)。成员变量的访问修饰符已正确定义,并且与PO问题无关。

+0

我接受;但文档类不会接受默认访问说明符。 – Benny

+0

任何设置为文档类的类都必须公开,就像用作动作项目的主类的任何类一样,或者Flex项目必须是公共的,或者真的是任何其他技术,应用程序的这些“主入口点”不能隐藏在任何否则这些应用程序将无法工作。 – BotMaster