سؤال

اعتبارا من الآن. لدي 3 كائنات. صورة نقطية واحدة تعمل كقماش الخاص بي. و 2 bitmapdatas. واحد هو عازفي وآخر هو البلاط الخاص بي. أقوم بإنشاء تأثير تبليط للعبة. أرغب في أخذ بلاطتي: Bitmapdata ، وتحويله إلى كائن مخصص. السبب هو أنني أريد أن يكون كل بلاط تفاعليًا. لذلك يمكنني النقر على كل واحد. هل من الممكن تحويل Bitmapdata الذي يمثل البلاط ، إلى كائن مخصص له خصائص وطرق. نوع من مثل مقطع الفيلم. ورسمها في المخزن المؤقت ؟؟ هل يمكنني إنشاء فصل جديد يمتد bitmapdata ؟؟ أو هل يجب أن أتخلص من المخزن المؤقت ورسم كائنات البلاط مباشرة في صورة نقطية ؟؟

بمعنى آخر ، ما هي أفضل طريقة لوضع العفريت أو البلاط في كائن Bitmapdata أو حتى صورة نقطية.

هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، لا يمكن تبديل Bitmapdata و Bitmap. هما شيئان مختلفان للغاية. تحتوي فئة BitmapData على بيانات بكسل Bitmap ، وتتيح لك معالجة بيانات البكسل ، على سبيل المثال ، قم بتغيير لون البكسلات المعينة ، وآخرون. لا توجد طريقة لعرض صورة نقطية مباشرة ، أي بإضافتها إلى قائمة العرض.

فئة Bitmap ، من ناحية أخرى ، هي عرض DisplayObject ، مثل MovieClips و Sprites ، التي أنت تستطيع أضف إلى قائمة العرض. غرض واحد هو تقديم bitmapdata في قائمة العرض. في الواقع ، إنه ليس تفاعليًا ، لذلك لا يمكنك اكتشاف النقرات مباشرة على مثيل صورة نقطية ، على سبيل المثال.

على سؤالك: إذا كان لديك بيانات نقطية تحتوي على عتثرة بلاط ، وتريد رسم هذا البلاط في صورة نقطية أخرى ، فيمكنك استخدام طريقة bitmapdata.draw () ، أو طريقة bitmapdata.copypixels (). هذا الأخير هو واحد من أسرع الطرق التي يمكنك استخدامها في أي صورة نقطية ، لذلك أوصي به بشدة.

اعتمادًا على تطبيقك الخاص ، قد لا يكون من المفيد رسم كل شيء في صورة نقطية على الإطلاق. يبدو الأمر كما لو كنت تريد أن تكون قادرًا على اكتشاف أحداث النقر فوق جميع البلاط ، مما يجعلني أعتقد أنك ربما تستفيد من جعلها منفصلة عن DisplayObjects ، على سبيل المثال.

إذا كنت ترغب في ذلك ، فيمكنك إنشاء فئة من البلاط التي تمتد العفريت ، وترسم صورة نقطية باستخدام ملء نقطية. وبهذه الطريقة ، يمكنك الحصول على أي خصائص تريدها ، وكذلك اكتشاف أحداث الماوس على مثيلات البلاط.

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();

يمينك ، اترك السحب عند 0 ، 0. باستخدام matrix.translate ، يتيح لك تحريك موقع أي جزء من البلاط الذي تريده ، دون التأثير على موضع العفريت نفسه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top