Actionscript 3 向位图数据添加对象
从现在开始。我有三个物体。一个用作画布的位图。和2个位图数据。一个是我的缓冲区,另一个是我的瓷砖。我正在为游戏创建一个平铺效果。我想将我的tile:BitMapData转换为自定义对象。原因是我希望每个互动程序都是交互式的。所以我可以点击每一个。是否可以将表示平铺的bitMapData转换为具有属性和方法的自定义对象。有点像电影剪辑。把它放进我的缓冲区??我可以创建一个扩展bitMapData的新类吗??还是我必须去掉缓冲区,直接将平铺对象绘制到位图中Actionscript 3 向位图数据添加对象,actionscript-3,bitmap,tiles,bitmapdata,Actionscript 3,Bitmap,Tiles,Bitmapdata,从现在开始。我有三个物体。一个用作画布的位图。和2个位图数据。一个是我的缓冲区,另一个是我的瓷砖。我正在为游戏创建一个平铺效果。我想将我的tile:BitMapData转换为自定义对象。原因是我希望每个互动程序都是交互式的。所以我可以点击每一个。是否可以将表示平铺的bitMapData转换为具有属性和方法的自定义对象。有点像电影剪辑。把它放进我的缓冲区??我可以创建一个扩展bitMapData的新类吗??还是我必须去掉缓冲区,直接将平铺对象绘制到位图中 换句话说,将精灵或平铺放入BitMapDa
换句话说,将精灵或平铺放入BitMapData对象甚至位图的最佳方式是什么。首先,BitMapData和位图是不可互换的。它们是两种截然不同的东西。BitmapData类包含位图像素数据,并允许您操作该像素数据,例如绘制、更改特定像素的颜色等。无法直接显示位图数据,即将其添加到显示列表中 另一方面,位图类是一个DisplayObject,如MovieClips和Sprites,您可以将其添加到显示列表中。它的唯一用途是在显示列表中呈现位图数据。事实上,它甚至不是交互式的,因此您无法直接检测位图实例上的单击 关于您的问题:如果您有一个包含平铺精灵的位图数据,并且希望在另一个bitmapdata中绘制该平铺,则可以使用bitmapdata.draw()方法或bitmapdata.copyPixels()方法。后者是可以在任何BitmapData上使用的最快方法之一,因此我强烈推荐它 根据您的特定应用程序,在位图中绘制所有内容可能根本没有好处。听起来好像您希望能够检测所有互动程序上的点击事件,这让我认为,将它们作为单独的显示对象(例如精灵)可能会让您受益匪浅 如果需要,可以创建扩展Sprite的平铺类,并使用位图填充绘制位图数据。这样,您就可以拥有任何想要的属性,还可以检测平铺实例上的鼠标事件
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);
这样,您根本不必使用位图类来渲染瓷砖。它们可以直接添加到显示列表中。首先,位图数据和位图不能互换。它们是两种截然不同的东西。BitmapData类包含位图像素数据,并允许您操作该像素数据,例如绘制、更改特定像素的颜色等。无法直接显示位图数据,即将其添加到显示列表中 另一方面,位图类是一个DisplayObject,如MovieClips和Sprites,您可以将其添加到显示列表中。它的唯一用途是在显示列表中呈现位图数据。事实上,它甚至不是交互式的,因此您无法直接检测位图实例上的单击 关于您的问题:如果您有一个包含平铺精灵的位图数据,并且希望在另一个bitmapdata中绘制该平铺,则可以使用bitmapdata.draw()方法或bitmapdata.copyPixels()方法。后者是可以在任何BitmapData上使用的最快方法之一,因此我强烈推荐它 根据您的特定应用程序,在位图中绘制所有内容可能根本没有好处。听起来好像您希望能够检测所有互动程序上的点击事件,这让我认为,将它们作为单独的显示对象(例如精灵)可能会让您受益匪浅 如果需要,可以创建扩展Sprite的平铺类,并使用位图填充绘制位图数据。这样,您就可以拥有任何想要的属性,还可以检测平铺实例上的鼠标事件
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);
这样,您根本不必使用位图类来渲染瓷砖。它们可以直接添加到显示列表中。当您想要选择瓷砖的某些部分而不影响精灵本身的位置时,我想出了一个更好的解决方案
theMatrix.translate(30,0);
this.graphics.beginBitmapFill(tileImage,theMatrix);
//this.graphics.drawRect(0, 0,tWidth ,tHeight );
this.graphics.endFill();
你的右边,在0,0离开drawRect。使用Matrix.Translate,可以在不影响精灵自身位置的情况下移动所需的互动程序部分的位置。我为您选择互动程序的某些部分而不影响精灵自身位置提供了更好的解决方案
theMatrix.translate(30,0);
this.graphics.beginBitmapFill(tileImage,theMatrix);
//this.graphics.drawRect(0, 0,tWidth ,tHeight );
this.graphics.endFill();
你的右边,在0,0离开drawRect。使用Matrix.Translate,可以在不影响sprite自身位置的情况下移动所需瓷砖部分的位置。这听起来像是我必须要做的。这是我唯一能让我的瓷砖互动的方法,我想不出其他方法。所以听起来我应该把我的画布变成一个精灵对象。然后添加我的平铺:在其中添加精灵对象。这意味着我也将去掉缓冲区bitmapData对象。或者,向位图对象添加精灵是否更快或可能??据我所知,这似乎不可能。你是对的。不可能将显示对象添加为位图的子对象(因为它不是DisplayObjectContainer。),但另一方面,没有理由希望这样做。事实上,Bitmap类几乎没有什么通用性。我应该澄清一下,我在上面的评论中说的是,Bitmap类不做位图填充所不能做的事情,后者不需要对象实例化,也不需要添加dept