0

今のところ。私は3つのオブジェクトを持っています。キャンバスとして機能する 1 つの BitMap。および 2 つの bitmapDatas。1 つは私のバッファーで、もう 1 つは私のタイルです。ゲームのタイル効果を作成しています。tile:BitMapData をカスタム オブジェクトに変換したいと思います。その理由は、各タイルをインタラクティブにしたいからです。だから私はそれぞれをクリックすることができます。タイルを表す bitMapData を、プロパティとメソッドを持つカスタム オブジェクトに変換することは可能ですか。ムービークリップのようなもの。それを私のバッファに描画しますか?? bitMapData を拡張する新しいクラスを作成できますか?? または、バッファを取り除き、タイル オブジェクトを BitMap に直接描画する必要がありますか??

言い換えれば、スプライトまたはタイルを BitMapData オブジェクトまたはビットマップに配置する最良の方法は何ですか?

4

2 に答える 2

3

まず、BitmapData と Bitmap は互換性がありません。それらは2つの非常に異なるものです。BitmapData クラスにはビットマップ ピクセル データが含まれており、そのピクセル データを操作できます。たとえば、描画したり、特定のピクセルの色を変更したりできます。BitmapData を直接表示する方法、つまり表示リストに追加する方法はありません。

一方、Bitmap クラスは、MovieClip や Sprite と同様に、表示リストに追加できるDisplayObject です。その唯一の目的は、表示リストに BitmapData をレンダリングすることです。実際、インタラクティブでさえないため、たとえば Bitmap インスタンスでクリックを直接検出することはできません。

あなたの質問に: タイル スプライトを含むビットマップ データがあり、そのタイルを別のビットマップデータに描画する場合は、BitmapData.draw() メソッドまたは BitmapData.copyPixels() メソッドを使用できます。後者は、任意の BitmapData で使用できる最速の方法の 1 つなので、強くお勧めします。

特定のアプリケーションによっては、すべてをビットマップで描画することがまったく有益でない場合があります。すべてのタイルでクリック イベントを検出できるようにしたいように思えますが、スプライトなどの別々の DisplayObject にすることでおそらくメリットがあると思います。

必要に応じて、Sprite を拡張する Tile クラスを作成し、ビットマップ塗りつぶしを使用して BitmapData を描画できます。そうすれば、任意のプロパティを設定でき、タイル インスタンスでマウス イベントを検出することもできます。

package
{
  /* ... imports ... */

  public class Tile extends Sprite 
  {
    private var _solid : Boolean;

    public function Tile(bmp : BitmapData, solid : Boolean)
    {
      this.graphics.beginBitmapFill(bmp, null, false, true);
      this.graphics.drawRect(0, 0, bmp.width, bmp.height);

      _solid = solid;
    }

    /**
     * Sample custom property. Could be used to define whether a tile
     * is solid, e.g. the player cannot pass it.
    */
    public function get isSolid() : Boolean
    {
      return _solid;
    }
  }
}

このクラスは、ゲーム内のタイルごとに単純にインスタンス化して、タイルに描画する必要があるビットマップ データを渡すことができます。このようなタイル インスタンスでイベントをリッスンすることもできます。

var tile : Tile;

tile = new Tile(myBitmapData, false);
tile.x = 200;
tile.y = 200;
tile.addEventListener(MouseEvent.CLICK, handleTileClick);

addChild(tile);

この方法では、Bitmap クラスを使用してタイルをレンダリングする必要はまったくありません。表示リストに直接追加できます。

于 2009-12-28T20:55:34.400 に答える
0

スプライト自体の位置に影響を与えずにタイルの特定の部分を選択したい場合のより良い解決策を考えます

theMatrix.translate(30,0);
this.graphics.beginBitmapFill(tileImage,theMatrix);
//this.graphics.drawRect(0, 0,tWidth ,tHeight );
this.graphics.endFill();

そうです、drawRect は 0, 0 のままにします。Matrix.Translate を使用すると、スプライトの位置自体に影響を与えることなく、タイルの必要な部分の位置を移動できます。

于 2009-12-31T01:58:03.497 に答える