0

就目前而言。我有 3 个对象。一个充当我画布的位图。和 2 个位图数据。一个是我的缓冲区,另一个是我的瓷砖。我正在为游戏创建平铺效果。我想拿我的 tile:BitMapData,把它变成一个自定义对象。原因是我希望每个图块都是交互式的。所以我可以点击每一个。是否可以将代表图块的 bitMapData 转换为具有属性和方法的自定义对象。有点像电影剪辑。并将其绘制到我的缓冲区中??我可以创建一个扩展 bitMapData 的新类吗?还是我必须摆脱缓冲区并将平铺对象直接绘制到位图中?

换句话说,将 Sprite 或 tile 放入 BitMapData 对象甚至是 Bitmap 的最佳方式是什么。

4

2 回答 2

3

首先,BitmapData 和 Bitmap 不可互换。它们是两个非常不同的东西。BitmapData 类包含位图像素数据,并允许您操作该像素数据,例如对其进行绘制、更改特定像素的颜色等。无法直接显示 BitmapData,即将其添加到显示列表中。

另一方面,Bitmap 类是一个 DisplayObject,就像 MovieClips 和 Sprites,您可以将其添加到显示列表中。它的唯一目的是在显示列表中呈现 BitmapData。事实上,它甚至都不是交互式的,因此您无法直接检测到对 Bitmap 实例的点击。

关于您的问题:如果您有一个包含图块精灵的位图数据,并且您想在另一个位图数据中绘制该图块,则可以使用 BitmapData.draw() 方法或 BitmapData.copyPixels() 方法。后者是您可以在任何 BitmapData 上使用的最快方法之一,因此我强烈推荐它。

根据您的特定应用程序,在位图中绘制所有内容可能根本没有好处。听起来好像您希望能够检测所有图块上的点击事件,这让我认为您可能会从让它们成为单独的显示对象(例如 Sprites)中受益。

如果您愿意,可以创建一个扩展 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 回答