BitmapData.draw () Матричная проблема - PullRequest
0 голосов
/ 15 октября 2010

Я столкнулся с проблемой, когда метод BitmapData.draw () точно не вычитает данные изображения из .png, который использует прозрачность.

Я собрал тестовый файл, который показывает это поведение, он находится здесь: http://www.filedropper.com/shield_1

В двух словах, спрайт падает с верхней части экрана, и когда он пересекается со спрайтом в нижней части экрана, выпадающий спрайт отбирает часть спрайта внизу. У меня все это работает, за исключением того, что когда я сбрасываю положение спрайта по x и y после того, как он пересек нижний спрайт, и он снова пересекается с нижним спрайтом, он не берет кусок спрайта такого же размера дно.

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

Вот код, который требует двух файлов png в библиотеке со значениями Linkage ShieldBase и SnowBall.

package 
{

 import flash.display.Sprite;
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.BlendMode;
 import flash.geom.Point;
 import flash.geom.Matrix;
 import flash.geom.Rectangle;
 import flash.events.Event;

 public class Shield extends Sprite
 {

  public var baseBmpData:BitmapData = new ShieldBase(0,0);
  public var baseBmp:Bitmap = new Bitmap(baseBmpData);
  public var missileBitmapData:BitmapData = new SnowBall(0,0);
  public var missileBitmap:Bitmap = new Bitmap(missileBitmapData);

  public var missileMatrix:Matrix = new Matrix();

  public function Shield()
  {

   baseBmp.y = 300;
   baseBmp.x = 40;
   stage.addChild(baseBmp);

   missileBitmap.x = 85;
   missileBitmap.y = 0;
   stage.addChild(missileBitmap);

   stage.addEventListener(Event.ENTER_FRAME, dropFromSky);

  }

  public function dropFromSky(e:Event)
  {

   for (var i:int=0; i<10; i++)
   {

    if (baseBmpData.hitTest(new Point(baseBmp.x,baseBmp.y),0x00,new Point(missileBitmap.x,missileBitmap.y)))
    {

     missileBitmap.y++;

     missileMatrix = new Matrix();
     missileMatrix.translate(baseBmp.x,baseBmp.y);
     missileMatrix.tx = (missileBitmap.x - baseBmp.x);
     missileMatrix.ty = (missileBitmap.y - baseBmp.y);

     // public function draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:flash.geom:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
     baseBmpData.draw(missileBitmap, missileMatrix, null, BlendMode.ERASE, null, true);

     missileBitmap.x = rand(60, 140);
     missileBitmap.y = 0;
    }
    else
    {
     missileBitmap.y++;
    }

   }

  }

  public function rand(low:Number=0, high:Number=1):Number
  {
   return Math.floor(Math.random() * (1+high-low)) + low;
  }


 }

}

Я думаю, что проблема в том, что hitTest и / или BitmapData.draw () не работают должным образом.

большое спасибо,

Девин

1 Ответ

0 голосов
/ 16 октября 2010

Есть две проблемы.

1) Позиция, которую вы проверяете на столкновение;если вы используете центр шара вместо верхнего левого, то он работает правильно.

2) Тень на вашем щите:
Что происходит, когда пиксели на краю тениедва видимы, что приводит к успеху hitTest;Я бы посоветовал вам удалить тень с изображения и применить его, используя реальный фильтр тени во вспышке.Чтобы заставить его работать с тенью, я изменил пороговое значение альфа в hitTest на 128, чтобы полупрозрачные пиксели тени игнорировались.Вы можете оставить порог равным 0, но это выглядит странно в начале, когда мяч, по-видимому, ничего не ударяет.

Измените это:

baseBmpData.hitTest(new Point(baseBmp.x,baseBmp.y),0x00,new Point(missileBitmap.x,missileBitmap.y))

на это:

baseBmpData.hitTest(new Point(baseBmp.x,baseBmp.y),128,new Point(missileBitmap.x+missileBitmap.width*0.5,missileBitmap.y+missileBitmap.height*0.5))
...