我创建了一个基本类来处理一个任务,我知道我想在用Flixel编程一些平台游戏的过程中做很多事情。该类是用纯 AS3 编写的,旨在保存将嵌入式文件转换为各种数据类型的持续功能,这些数据类型需要多个步骤才能完成。
package net.darkglass.conversion
{
import flash.display.BitmapData;
import flash.display.DisplayObject;
public class Embedded
{
/**
* Returns a BitmapData loaded with the given embedded image class.
*
* This function does no real error checking.
*
* TODO: Establish basic error checking for function.
*
* @param image An embedded image class object
* @return BitmapData loaded with contents of Image
*/
public function imageToBitmapData(image:Class):BitmapData
{
// instantiate image as a DisplayObject
var imageDisplayObject:DisplayObject = new image();
// create empty BitmapData to use, using image's size for the BitmapData's size
var imageBitmapData:BitmapData = new BitmapData(imageDisplayObject.width, imageDisplayObject.height);
// load imageDisplayObject's contents into imageBitmapData
imageBitmapData.draw(imageDisplayObject);
// that should be all we need. Return imageBitmapData
return imageBitmapData;
}
}
}
然后,我在代码中实例化了这个对象,并以两种略有不同的方式继续尝试使用它来生成加载的BitmapData
。
第一个失败了(似乎成功地创建了一个空的位图数据):
// ...
/* Our source image for the test map */
[Embed(source="../asset/graphic/debug/testmap.png")]
public var testmap:Class;
// ...
public var converter:Embedded;
// ...
// test level!
var testmapBD:BitmapData = converter.imageToBitmapData(testmap);
第二个,显示与第一个相同的结果:
// ...
// Only the last few lines change...
// ...
// test level!
var testmapBD:BitmapData = new BitmapData(0, 0);
testmapBD = converter.imageToBitmapData(testmap);
// ...
AS3 似乎没有返回实例化的对象?或者,显然,任何可用的东西?作为一次性的,我继续尝试将BitmapData的尺寸从第二种情况更改为正确的大小,但无济于事:
// ...
// Only the last few lines change...
// ...
// test level!
var testmapBD:BitmapData = new BitmapData(40, 30);
testmapBD = converter.imageToBitmapData(testmap);
// ...
在这里和周围搜索一下,我的印象是原语在 AS3 中是按值传递的,而复杂类型是按引用传递的......我会假设(无论多么不安全)BitmapData
是一种复杂的类型。
有没有办法做到这一点?我在这里误解或遗漏了什么?
我很有用:
package net.icodeapps.examples.repos
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.utils.Dictionary;
public class ImageRepository
{
private var _classes:Dictionary;
public function ImageRepository()
{
_classes = new Dictionary();
}
public function getBitmapDataOfType(clazz:Class):BitmapData
{
if (!clazz) throw new ArgumentError('Argument clazz might not be null');
if (_classes[clazz]) return BitmapData(_classes[clazz])
const bitmapDrawable:DisplayObject = new clazz() as DisplayObject;
if (!bitmapDrawable) throw new ArgumentError('Instance created from argument clazz must be IBitmapDrawable.');
const bitmapData:BitmapData = new BitmapData(bitmapDrawable.width, bitmapDrawable.height);
bitmapData.draw(bitmapDrawable);
_classes[clazz] = bitmapData;
return bitmapData;
}
public function getBitmapFor(clazz:Class):Bitmap
{
return new Bitmap(getBitmapDataOfType(clazz));
}
}
}
这是一个基本的缓存,它还允许您重用BitmapData实例。一些错误处理会对您有所帮助,也许我的代码是查找一些错误的良好入门?
当你像这样嵌入类时,你会得到一个BitmapAsset,它已经有一个BitmapData。因此,您可以检查并查看新创建的实例是否是位图资产,然后返回其像素。您还可以使用 Embed 标记的 MimeType 部分来防止 Flex 将您的图像包装在 BitmapAsset 中。
很多时候,我在任何代码中最糟糕的问题似乎都可以简化为"你是否正确初始化了你的对象?
我无法将答案归功于上面的32bitkid;但是,根据我自己的代码和描述的问题,他的答案是正确的。只需通过converter = new Embedded()
converter
初始化Embedded
对象即可解决问题,而无需进一步更改我的代码。 BitmapData
对象可以使用返回的数据进行初始化,并且它的行为就像我怀疑它会基于之前语言规范中的注释一样。
然而,Amy Blankenship的回答和Florian Salihovic的答案作为数据和代码的碎片都是有价值的。艾米·布兰肯希普(Amy Blankenship)的回答揭示了一些关于该语言及其行为的数据,我花了一段时间才挖掘出来确认;将这些有用的信息直接带到表面永远不会是坏事。毫无疑问,Florian的答案既是有趣的代码(从仍在学习的人的角度来看),又对特定情况有用。
根据我的实际理解和我最初提出的问题,对我来说最好的解决方案只是"我是个白痴,现在需要写一个巨大的标志挂在我的工作机器对面的墙上,上面写着正确初始化你的对象"。然而,这并不是要诋毁或贬低所提供的其他解决办法的效用。
但是,在此之后,我确实想交出我的许可证以一起破解代码。这是我唯一真正的问题是无法正确初始化的第二次记录。