截至目前。我有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,让你移动你想要的瓦片的哪一部分的定位,在不影响自身的精灵位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top