Я столкнулся с проблемой, когда метод 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 () не работают должным образом.
большое спасибо,
Девин