【问题标题】:how to pass a variable between AS3 classes如何在 AS3 类之间传递变量
【发布时间】:2011-03-02 15:21:06
【问题描述】:

我在类之间传递变量时遇到了问题。

我有一个名为 GlobeView.as 的类

其中是一个旨在为地球添加标记的函数

GlobeView.as -

public function addAdventureMarker( latitude:Number, longitude:Number, name:String=null ):void
    {
        var marker:Marker = new Marker();
        marker.name = name;
        placeMarker( marker, latitude, longitude );
    }

此函数创建一个名为 Marker 的类的新实例。在 Marker.as 中有一个函数可以定义标记的颜色

Marker.as -

public function Marker()
    {
        super();

        var frontMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
        var backMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
        var leftMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
        var rightMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
        var topMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
        var bottomMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );

        var materials:MaterialsList = new MaterialsList( { front:frontMaterial, back:backMaterial, left:leftMaterial, right:rightMaterial, top:topMaterial, bottom:bottomMaterial } );
        cube = new Cube( materials, width, depth, height );
        cube.addEventListener( InteractiveScene3DEvent.OBJECT_OVER, onCubeOver, false, 0, true );
        cube.addEventListener( InteractiveScene3DEvent.OBJECT_OUT, onCubeOut, false, 0, true );
        cube.addEventListener( InteractiveScene3DEvent.OBJECT_CLICK, onCubeClick, false, 0, true );
        cube.geometry.vertices[0].x -= 4;
        cube.geometry.vertices[0].y += 4;
        cube.geometry.vertices[1].x -= 4;
        cube.geometry.vertices[1].y -= 4;
        cube.geometry.vertices[2].x += 4;
        cube.geometry.vertices[2].y += 4;
        cube.geometry.vertices[3].x += 4;
        cube.geometry.vertices[3].y -= 4;
        addChild( cube );
        cube.moveBackward( depth / 2 );
    }

我要做的是在 GlobeView.as 中定义一个变量 例如var markerColor:String;

添加标记时,给变量一个值 例如

{
var marker:Marker = new Marker();
marker.name = name;
markerColor = "red";
placeMarker( marker, latitude, longitude );
}

然后在标记类中添加 if 语句

例如

public function Marker()
    {
        super();

        if (markerColor=="red")
        {
            var frontMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
            var backMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
            var leftMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
            var rightMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
            var topMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
            var bottomMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
        }

我希望这是有道理的 - 可能比它需要的复杂得多

【问题讨论】:

    标签: flash actionscript-3 class variables


    【解决方案1】:

    为什么不在构造函数中传递这些变量?

    public function Marker( name: String, color: String = "blue" )
    {
        super();
        this.name = name;
        if (color == "red")
        {
             // ...
        }
    }
    

    默认情况下,它会将颜色字符串设置为“蓝色”。该代码似乎确实可以使用一些重构。例如,直接传递颜色参数(例如,使用 uint 并在 ColorMaterial 的构造函数中使用该变量):

    public function Marker( name: String, color: uint )
    {
        var material: ColorMaterial = new ColorMaterial( color, ... );
        // ...
    }
    

    或者更好的是,有预定义的材料列表并通过其中之一。

    【讨论】:

    • 感谢邪恶活动!我花了一点时间来了解您的代码,我对此完全陌生,但这很有效!非常感谢您的宝贵时间
    【解决方案2】:

    这段代码更简单,也适用于我。

    在标记类中:

    private var m_color:String;
    
    public function markerColor(value:String):void {
            this.m_color = value;
    }
    

    在主类中:

    var marker:Marker = new Marker();
    marker.markerColor("red");
    

    【讨论】:

      【解决方案3】:

      您将“markerColor”定义为 GlobeView 类中的变量,并在 Marker 类中引用它。除非您将 GlobeView.markerColor 的值传递给 Marker 类,否则 Marker 类不会知道它的值。

      在您的代码(如下)中,markerColor 与标记对象或 Marker 类没有任何关联。

      {
        var marker:Marker = new Marker();
        marker.name = name;
        markerColor = "red";
        placeMarker( marker, latitude, longitude );
      }
      

      您可以向 Marker 类添加“markerColor”属性/变量:

      private var m_color:String
      public function markerColor():String {
        return m_color;
      }
      public function set markerColor(value:String):void {
        this.m_color = value;
      }
      

      然后将您的代码更改为:

      {
        var marker:Marker = new Marker();
        marker.name = name;
        marker.markerColor = "red";
        placeMarker( marker, latitude, longitude );
      }
      

      【讨论】:

      • 感谢您的回复 Ryan,我认为这正是我想要实现的目标,尽管我几乎是一个有竞争力的新手,上面的代码抛出了错误 - 1053: Accessor types must在“pulic function set markercolor(value:String):void - 这可能是一个 Flex 错误?
      • 别担心 Ryan,我已经用上面的人的代码弄明白了,不过再次感谢你
      • 我错过了一个“get”。第一个公共函数应该是“public function get markerColor():String ...”。对此感到抱歉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多