Actionscript 3对数组中的public static var的引用不起作用

时间:2010-02-25 02:31:32

标签: actionscript-3

我正在设置一类公共静态变量,它们是BitmapData。

我遇到的问题是我似乎无法在数组中动态引用变量,因此如果没有一些严格的procdedural样式编码,就无法给它们赋值。

这就是它的样子

package com.myPackage{

  import flash.display.*;
  import flash.events.*;
  import flash.net.*;

    public class Images extends Sprite{

       private var url1:String = "http://www.mydomain.com/myImage.jpg";
       private var url2:String = "http://www.mydomain.com/myImage2.jpg";

       public static var IMAGE_ONE_BDATA:BitmapData;
       public static var IMAGE_TWO_BDATA:BitmapData;

       private var urlArray = new Array(url1,url2);
       private var bDataArray = new Array(IMAGE_ONE_BDATA, IMAGE_TWO_BDATA);
       private var count:int = 0;

       public function Images(){
         initLoader();
       }

       private function initLoader():void
       {
          if(count < urlArray.length){
            var url:String = urlArray[count];
            var loader:Loader = new Loader();
            loader.load(new URLRequest(url));
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
            bDataArray[count] = e.target.content.bitmapData;
            trace(IMAGE_ONE_BDATA) // <-- this should trace ([object-bitmapdata]) but instead returns null.. this is where I have to make a direct reference like..
            IMAGE_ONE_BDATA = e.target.content.bitmapData;
            trace(IMAGE_ONE_BDATA) // <-- will now return my bitmapdata object

            count++;
            initLoader();
           }else{
            dispatchEvent(new ImagesLoadedEvent);
       }
    }
 }  

我应该假设它是因为我的数组是私有var并且对公共静态变量的引用是非法的吗?有人会打电话给闪电警察吗? 任何输入都高度赞赏。

-Jascha

3 个答案:

答案 0 :(得分:1)

你有点误解了变量是什么。它们不是对象,它们是对象的引用。

让我试着通过引导您完成代码来解释:

因此,这两个变量仅对Images实例是本地的,并引用您定义的两个字符串:

private var url1:String = "http://www.mydomain.com/myImage.jpg";
private var url2:String = "http://www.mydomain.com/myImage2.jpg";

现在您定义了两个变量,但是您没有为它们分配任何值,所以目前它们是空的,或者在AS3中为“null”:

public static var IMAGE_ONE_BDATA:BitmapData;
public static var IMAGE_TWO_BDATA:BitmapData;

现在您创建一个新数组并将url1和url2引用的两个对象传递给它。请注意,存储这两个变量, 存储这些变量引用的对象。更多内容如下:

private var urlArray = new Array(url1,url2);

现在,如果你将url1更改为“hello url1”并跟踪urlArray,你仍然会在数组中有两个url。

如果一切都有意义,那么希望你能看到这里会发生什么:

private var bDataArray = new Array(IMAGE_ONE_BDATA, IMAGE_TWO_BDATA);

您尚未将任何对象附加到IMAGE_ONE_BDATA或IMAGE_TWO_BDATA;它们仍为null,因此您将null传递给数组两次。稍后,如果您将对象分配给IMAGE_ONE_BDATA,则尚未将其分配给数组,只是将其分配给该变量。

现在您已将bitmapdata分配给数组,但未分配给IMAGE_ONE_BDATA。你的期望是错误的,它应该返回null:

    bDataArray[count] = e.target.content.bitmapData;
    trace(IMAGE_ONE_BDATA) // <-- this _should_ trace null

接下来你将bitmapData引用到IMAGE_ONE_BDATA,所以现在它有一个引用

     IMAGE_ONE_BDATA = e.target.content.bitmapData;
     trace(IMAGE_ONE_BDATA) // <-- will now return my bitmapdata object

错误是将IMAGE_ONE_BDATA视为一个对象,您将bitmapData放入其中,而不是作为一个名称放在便条上,当您想跟踪它们时,它会粘贴在对象上。位图数据本身就是您感兴趣的对象,而不是名称。

如果您需要将位图数据设为公共和静态,请忘记IMAGE_ONE_BDATA和IMAGE_TWO_BDATA并定义:

public static var bDataArray:Array

代替。

希望这有帮助 - 没有Flash警察。 :)

答案 1 :(得分:0)

好的,这就是我要尝试保持某种参考结构,我很满意。

在循环外我将bDataArray重命名为bDataNameArray。 并声明另一个公共静态var数组bDataObjects。

然后在循环内

var bDataNameArray[i]:Object = new Object();
bDataNameArray[i].bData = e.target.content.bitmapData;
bDataObjects.push(bDataNameArray[i]);

所以现在,也许如果可以的话,在我的代码的下一行,我可以像

那样引用
var bitmap:Bitmap = new Bitmap(Images.bDataObjects.IMAGE_ONE_DATA.bData);

或者我可以坚持使用传统的物品名称。像ob:Object = new Object()......但是这有多无聊?

-J

答案 2 :(得分:0)

可悲的是AS3不允许你制作这样的对象。你总是可以这样做:

public static var bDataNameArray:Object = new Object();
bDataNameArray["MY_AWESOME_UPPERCASE_NAME"] = e.target.content.bitmapData;

将位图数据存储到bDataNameArray中。然后你可以通过在其他地方做到这一点来解决它:

var data:BitmapData = Images.bDataNameArray["MY_AWESOME_UPPERCASE_NAME"];
var bitmap:Bitmap = new Bitmap(data);

希望这一切都有帮助。祝你好运。