0

我创建了一个基本类来处理我知道在 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.

第一个失败(似乎成功创建了一个空的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是一个复杂的 -类型。

有没有办法做到这一点?我在这里误解或遗漏了什么?

4

3 回答 3

1

这对我很有效:

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 实例。一些错误处理会对您有所帮助,也许我的代码是查找错误的良好开端?

于 2012-06-02T09:58:50.167 回答
1

当你像这样嵌入类时,你会得到一个 BitmapAsset,它已经有一个 BitmapData。因此,您可以检查新创建的实例是否为 BitmapAsset,然后返回其像素。您还可以使用 Embed 标记的MimeType部分来防止 Flex 将您的图像包装在 BitmapAsset 中。

于 2012-06-02T16:30:06.513 回答
0

很多时候,我在任何代码中遇到的最糟糕的问题似乎都可以归结为“您是否正确初始化了对象?”

我无法将答案归功于上面的 32bitkid;但是,鉴于我自己的代码和描述的问题,他的答案是正确的。只需通过初始化Embedded对象即可解决问题,而无需对我的代码进行进一步更改。对象可以用返回的数据初始化,它的行为就像我怀疑它会基于之前语言规范中的注释一样。converterconverter = new Embedded()BitmapData

但是,Amy Blankenship 的答案和 Florian Salihovic 的答案都作为数据和代码的碎片很有价值。Amy Blankenship 的回答揭示了一些关于语言及其行为的数据,我花了一段时间才挖掘出来确认;将这些有用的信息直接带到表面从来都不是坏事。毫无疑问,弗洛里安的答案既是有趣的代码(从某人仍在学习的角度来看),而且对特定情况很有用。

根据我的实际理解和最初的要求,对我来说最好的解决方案只是“我是个白痴,现在需要写一个巨大的标志挂在我的工作机器对面的墙上,上面写着正确初始化你的对象”。但是,这并不是要贬低或贬低所提供的其他解决方案的有用性。

但是,我确实想在此之后交出我的许可证以一起破解代码。这是有记录以来第二次我唯一真正的问题是没有正确初始化。

于 2012-06-04T05:42:15.853 回答