我遇到了一个问题,即BitmapData.draw()方法没有准确地从使用透明度的.png中减去图像数据。
我已经整理了一个显示此行为的测试文件,它位于: http://www.filedropper.com/shield_1
简而言之,精灵从屏幕顶部掉落,当它与屏幕底部的精灵相交时,正在掉落的精灵会从底部取出一大块精灵。我已经完成了所有这些工作,除了当我在sprite与底部精灵相交之后重置精灵的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()无法正常工作。
非常感谢,德文
答案 0 :(得分:0)
有两个问题。
1)你测试碰撞的位置;如果您使用球的中心而不是左上角,那么它可以正常工作。
2)盾牌上的投影:
发生的是阴影边缘上几乎看不见的像素
hitTest
成功;我建议您从图像中删除阴影并使用闪存中的实际阴影滤镜应用它。
为了让它与投影一起使用,我将hitTest
中的alpha阈值更改为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))