我正在设置一类公共静态变量,它们是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
答案 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);
希望这一切都有帮助。祝你好运。