【问题标题】:Adding a object to a bitMapData将对象添加到 bitMapData
【发布时间】:2010-12-30 14:01:06
【问题描述】:

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

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

【问题讨论】:

    标签: actionscript-3 bitmap tiles bitmapdata


    【解决方案1】:

    当您想要选择图块的某些部分而不影响精灵本身的位置时,我想出了一个更好的解决方案

    theMatrix.translate(30,0);
    this.graphics.beginBitmapFill(tileImage,theMatrix);
    //this.graphics.drawRect(0, 0,tWidth ,tHeight );
    this.graphics.endFill();
    

    您的权利,将 drawRect 保留为 0、0。使用 Matrix.Translate,您可以移动您想要的图块的哪个部分的位置,而不会影响精灵位置本身。

    【讨论】:

      【解决方案2】:

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

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

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

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

      如果您愿意,您可以创建一个扩展 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 类来渲染图块。它们可以直接添加到显示列表中。

      【讨论】:

      • 这听起来像是我必须做的。这是我可以使我的图块交互的唯一方法,我想不出另一种方法。所以听起来我应该把我的画布变成一个精灵对象。然后在其中添加我的 tile:Sprite 对象。这意味着我也会摆脱缓冲区 bitmapData 对象。或者,将 Sprite 添加到 BitMap 对象是否更快或可能?据我所知,这似乎是不可能的。
      • 你是对的。不可能将显示对象添加为位图的子项(因为它不是 DisplayObjectContainer。)但另一方面,没有理由想要做这样的事情。事实上,Bitmap 类根本没有什么普遍用途。
      • 我应该澄清一下,我在上面的评论中所说的是,Bitmap 类没有做任何你不能用位图填充做的事情,后者不需要对象实例化并且不会增加深度到显示列表。最后,这是一个偏好问题,所以也许我不应该说“事实上”:)
      • 我明白你的意思。我做了你添加的东西,它奏效了。不过只有一个问题。我使用 graphics.beginBitmapFill() 添加了 tilesheet。 tilesheet 然后成为精灵。然后我使用 graphics.drawRect() 来挑选要使用的 tilesheet 的哪一部分。当我将 x 和 y 坐标添加到函数中时,这些坐标也会添加到精灵位于该画布上的坐标中。所以一些瓷砖比它假设的位置更远。您知道一种无需添加大量代码的更简单的方法吗?
      • 好吧,在我上面的代码中,我总是在精灵坐标空间的 0,0 处绘制图块。要定位瓷砖,您无需修改​​ drawRect() 调用,而是设置 Tile 实例的 x 和 y 属性。我已经编辑了帖子中的第二个代码块来展示一个例子。
      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 2011-12-17
      • 2014-09-14
      • 2022-01-13
      • 2010-12-17
      • 1970-01-01
      • 2018-09-06
      • 2013-04-17
      相关资源
      最近更新 更多