添加对象的BitmapData
-
21-09-2019 - |
题
截至目前。我有3个对象。一个位图作为我的画布。和2周的BitmapData。一个是我的缓冲区,另一个是我的瓷砖。我创建了一个游戏一个平铺的效果。我想利用我的瓷砖:位图数据,并把它变成一个自定义对象。原因是是我希望每个瓦片是互动的。所以,我可以点击每一个。是否有可能把我的BitmapData表示瓷砖,到具有属性和方法的自定义对象。有点像一个影片剪辑。并绘制成我的缓冲?我可以创建一个扩展的BitmapData一个新的类?或者,我将不得不摆脱缓冲区和借鉴瓷砖对象直接到位图??
在换句话说,什么是把Sprite或瓦片到BitmapData对象或甚至一个位图的最佳方式。
解决方案
首先,的BitmapData和Bitmap不能互换。他们是两个非常不同的事情。 BitmapData类包括位图的像素数据,并允许你操作的像素数据,例如绘制到它,改变特定像素,等C的颜色。没有通过将其添加到显示列表显示直接对BitmapData,即方式。
Bitmap类,在另一方面,为DisplayObject,像影片剪辑和子图形,您的可以添加到显示列表。它的唯一目的是要呈现的BitmapData显示列表。事实上,它甚至不是交互的,所以不能在Bitmap实例直接检测点击,例如
在你的问题:如果你有一个包含瓷砖精灵位图数据,并且要绘制平铺在另一个BitmapData,您可以使用BitmapData.draw()方法,或BitmapData.copyPixels()方法。后者是你可以在任何的BitmapData用最快的方法之一,所以我会极力推荐它。
根据您的具体应用,它可能不是有益的所有绘制位图的一切。这听起来就好像你要能够检测所有的瓷砖点击事件,这让我觉得你可能会从有他们是独立的DisplayObject,例如受益精灵。
如果你愿意,你可以创建一个扩展Sprite,并使用位图填充绘制的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类都呈现瓷砖。它们可以直接加入到显示列表中。
其他提示
我想,当你要选择的瓦片的某些部分一个更好的解决方案,而不影响Sprite本身
的位置theMatrix.translate(30,0);
this.graphics.beginBitmapFill(tileImage,theMatrix);
//this.graphics.drawRect(0, 0,tWidth ,tHeight );
this.graphics.endFill();
您的权利,使用Matrix.Translate离开的drawRect 0,0,让你移动你想要的瓦片的哪一部分的定位,在不影响自身的精灵位置。