对象中的对象

时间:2015-05-08 18:16:55

标签: actionscript-3 flash

我的库中有一个名为Bottle的对象。 Bottle由“Glass”和“Cap”实例组成。我的库中还有两个符号名为CapGlass

当我点击Bottle的上限时,它表示此对象属于Cap类,当我点击玻璃时,它表示类型为Glass。这些对象中的每一个都具有基类flash.display.MovieClip

然而,在我的代码中:

var bottleOnStage:Bottle = new Bottle();
addChild(bottleOnStage);
var newColor:uint = 0x00ff00;
var newColorTransform:ColorTransform = new ColorTransform();
newColorTransform.color = newColor;
bottleOnStage.Glass.transform.colorTransform = newColorTransform;

我收到此错误:

  

TypeError:错误#1010:术语未定义且没有属性。在MethodInfo-1()

我是否错误地访问了Glass属性?是因为我没有创建Glass的实例吗?我很困惑对象中的对象如何在Flash中工作。

修改

var cap:Cap;
var glass:Glass;

上面是我的Bottle.as文件中的内容。在我的Main.as文件中,我有:

var bottleOnStage:Bottle = new Bottle();
bottleOnStage.cap = new Cap();
bottleOnStage.glass = new Glass();
addChild(bottleOnStage);
var newColor:uint = 0x00ff00;
var newColorTransform:ColorTransform = new ColorTransform();
newColorTransform.color = newColor;
bottleOnStage.glass.transform.colorTransform = newColorTransform;

当我运行此代码时,瓶子的“玻璃”部分不会发生任何变化。为什么是这样?我知道这就是这条线;我已经跟踪并调试了所有其他行,我跟踪的颜色是正确的等等。当我使用addChild将“cap”和“bottle”添加到“bottleOnStage”时,我得到了这两个符号的副本,所以这个显然不是这样的。基本上,我如何在舞台上修改“上限”和“玻璃”?

2 个答案:

答案 0 :(得分:1)

看起来你的Classes与实例混淆了。实例名称不能与类名称相同(在同一范围内)。

Glass是你的班级。如果你的瓶子类中有一个名为“Glass”的变量,你需要重命名它,这样你的班级名称Glass就不会有歧义。

bottleOnStage.glassInstanceName.transform.colorTransform = newColorTransform;

作为提示,为了避免这种情况,最佳做法总是使您的实例名称以小写字母开头,并始终使您的类名称以大写字母开头。 (这也有助于大多数编码应用程序中的代码突出显示以及Stack Overflow中的代码突出显示 - 请注意大写项目是如何突出显示的?)

就您的错误而言,您可能还没有变量中的实际对象。

执行以下操作:

var myGlass:Glass;

实际上不会创建一个对象(值为null),它只是为一个对象定义一个占位符。您需要使用new关键字进行实例化以创建实际对象。

var myGlass:Glass = new Glass(); 

现在你将在该变量中拥有一个对象。

修改

为了解决您的编辑问题,听起来您可能想要这样的内容:

package {
    public class Bottle extends Sprite {
        public var cap:Cap;
        public var glass:Glass;

        //this is a constructor function (same name as the class), it gets run when you instantiate with the new keyword.  so calling `new Bottle()` will run this method:
        public function Bottle():void {
            cap = new Cap();
            glass = new Glass();

            addChild(cap); //you want these to be children of this bottle, not Main
            addChild(glass);
        }
    }
}

这可以保持所有封装,并添加帽子和玻璃作为瓶子的孩子。所以瓶子是主要的孩子,帽子和玻璃是儿童或瓶子。

答案 1 :(得分:0)

什么是瓶子中Glass属性的名称?

如果你有例如:

 public class Bottle {

    public var glass : Glass;

}

您可以通过以下方式访问玻璃板:

var bottle : Bottle = new Bottle();
bottle.glass = new Glass();

玻璃是一流的。 bottle.glass是类Bottle的属性“glass”。

希望它有所帮助。