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;
    }
}
}

次に、コードでこのオブジェクトをインスタンス化し、2つのわずかに異なる方法で、ロードされたを生成するために使用しようとしました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);

2つ目は、1つ目と同じ結果を示しています。

// ...
// Only the last few lines change...
// ...
// test level!
var testmapBD:BitmapData = new BitmapData(0, 0);
testmapBD = converter.imageToBitmapData(testmap);
// ...

AS3はインスタンス化されたオブジェクトを返さないようですか?または、どうやら、何か使用できるものはありますか?1回限りとして、私は先に進み、BitmapDataのディメンションを2番目のケースから正しいサイズに変更しようとしましたが、役に立ちませんでした。

// ...
// 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

このようにクラスを埋め込むと、すでにBitmapDataを持っているBitmapAssetが得られます。したがって、新しく作成したインスタンスがBitmapAssetであるかどうかを確認してから、そのピクセルを返すことができます。また、EmbedタグのMimeType部分を使用して、Flexが画像をBitmapAssetでラップしないようにすることもできます。

于 2012-06-02T16:30:06.513 に答える
0

あまりにも頻繁に、コードでの私の最悪の問題は、「オブジェクトを適切に初期化したか」に還元できるようです。

私は答えのために上記の32bitkidを信用することができません。しかし、彼の答えは、私自身のコードと説明された問題を考えると正しいものです。を介してEmbeddedオブジェクトを初期化するだけで、コードを変更することなく問題が修正されます。オブジェクトは返されたデータで初期化でき、以前の言語仕様のメモに基づいていると思われるように動作します。converterconverter = new Embedded()BitmapData

ただし、AmyBlankenshipの回答とFlorianSalihovicの回答はどちらも、データとコードの断片として価値があります。エイミー・ブランケンシップの答えは、言語とその振る舞いについての少しのデータを明らかにしており、確認するために掘り下げるのに時間がかかりました。そのような有用な情報を直接表面化することは決して悪いことではありません。フロリアンの答えは、(誰かがまだ学んでいるという点から)興味深いコードであり、特定のケースに役立つことは間違いありません。

ここでの私にとっての最善の解決策は、私が実際に理解していることと、最初に尋ねていたことに基づいて、単に「私はばかであり、作業機の反対側の壁に掛けるために、オブジェクトを適切に初期化するという巨大な看板を書く必要があります。 "。ただし、それは、提供されている他のソリューションの有用性を損なったり、軽蔑したりするものではありません。

ただし、この後、コードを一緒にハッキングするためのライセンスを提出したいと思います。私の唯一の本当の問題が適切に初期化されていないことは、これが記録上2回目です。

于 2012-06-04T05:42:15.853 に答える