首先,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 类来渲染图块。它们可以直接添加到显示列表中。