Вопрос

На данный момент.У меня есть 3 объекта.Один BitMap, который действует как мой холст.И 2 растровых данных.Один из них — мой буфер, а другой — мои плитки.Я создаю эффект мозаики для игры.Я хотел бы взять свой tile:BitMapData и превратить его в собственный объект.причина в том, что я хочу, чтобы каждая плитка была интерактивной.Так что я могу нажать на каждый из них.Можно ли превратить мой битMapData, представляющий плитку, в собственный объект, имеющий свойства и методы.Что-то вроде клипа.и нарисовать его в свой буфер ??Могу ли я создать новый класс, расширяющий BitMapData??Или мне придется избавиться от буфера и рисовать тайловые объекты прямо в BitMap??

Другими словами, как лучше всего поместить спрайт или плитку в объект BitMapData или даже в растровое изображение.

Это было полезно?

Решение

Прежде всего, BitmapData и Bitmap не являются взаимозаменяемыми.Это две совершенно разные вещи.Класс BitmapData содержит данные пикселей растрового изображения и позволяет вам манипулировать этими данными пикселей, например.рисуйте к нему, меняйте цвет отдельных пикселей и т. д.Невозможно напрямую отобразить BitmapData, т.е.добавив его в список отображения.

С другой стороны, класс Bitmap представляет собой DisplayObject, такой как MovieClips и Sprites, который вы может добавить в список отображения.Его единственная цель — отобразить BitmapData в списке отображения.Фактически, он даже не является интерактивным, поэтому вы не можете, например, обнаружить клики непосредственно на экземпляре Bitmap.

К вашему вопросу:Если у вас есть растровые данные, содержащие спрайт плитки, и вы хотите нарисовать эту плитку в других растровых данных, вы можете использовать метод BitmapData.draw() или метод BitmapData.copyPixels().Последний — один из самых быстрых методов, которые можно использовать с любыми BitmapData, поэтому я настоятельно рекомендую его.

В зависимости от вашего конкретного приложения, возможно, вообще нецелесообразно рисовать все в растровом изображении.Звучит так, как будто вы хотите иметь возможность обнаруживать события щелчка на всех плитках, что заставляет меня думать, что вам, вероятно, было бы полезно, если бы они были отдельными DisplayObjects, напримерСпрайты.

Если вы хотите, вы можете создать класс Tile, который расширяет 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 для рендеринга плиток.Их можно добавить непосредственно в список отображения.

Другие советы

Я считаю, что это лучшее решение, когда вы хотите выбрать определенные части плитки, не влияя на положение самого спрайта.

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

Ваше право, оставьте drawRect в 0, 0.использование Matrix.Translate позволяет вам перемещать положение той части плитки, которую вы хотите, не затрагивая само положение спрайта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top