我有一个问题,我有潜在的解决方案。但我想确认是否有一种简单易行的方法来解决我的问题。
应用类型:
等距游戏
问题陈述:
我正在我的Flash应用程序中加载图像并附加了鼠标事件。
我加载的图像是道具图像,如车辆,树木,建筑物等,所有图像都是透明的。
示例:红球资产(请忽略我用来描述问题的黄色背景)
如果我点击实际图像区域(红色),那么每件事情都很完美
当我点击空图像部分(或透明区域,我以黄色显示)时,我不想触发mouseevent
通过在Flash中创建蒙版,我知道了一种方法。我不想这样做,除非这是最后一个选项,因为我加载图片资源而不是flash资源而且我不喜欢我想为所有资产创建一个新的掩码资产
我将采用另一种方法来使用Bitmap的getPixel方法。讨论了here。
但这种方法存在另一个问题。
当我点击资产的空白部分时,我可能会忽略点击事件,但如果在同一位置的图像后面有其他资产,那么我需要处理被遮挡图像的点击事件
好吧,考虑解决这个问题需要我去getObjectsUnderPoint我可以扫描被遮挡的资产
答案 0 :(得分:2)
那么,您提出的解决方案是100%有效。只需移动确定在该对象之外点击哪个游戏对象的逻辑。
MOUSE_DOWN/MOUSE_UP
个事件。BitmapData.getPixel32
getObjectsUnderPoint
来查找所有其他游戏对象现在你得到了被击中的实际对象。
答案 1 :(得分:1)
一个有趣的解决方案是使用Sprite
个对象,并将单个非透明像素刻在其上。
假设这是您的Loader
"完成"处理程序:
private function loaderCompleteHandler(event:Event):void
{
// Loader is not our child, we use a Sprite instead (below).
var loader:Loader = Loader(event.target);
var sprite:Sprite = new Sprite();
addChild(sprite);
var w:Number = loader.content.width;
var h:Number = loader.content.height;
// Use transparent bitmap.
var bitmapData:BitmapData = new BitmapData(w, h, true, 0);
bitmapData.draw(loader.content);
// Now burn the image onto the Sprite object, ignoring
// the transparent pixels.
for (var xPos:int = 0; xPos < w; xPos++) {
for (var yPos:int = 0; yPos < h; yPos++) {
var pixel32:uint = bitmapData.getPixel32(xPos, yPos);
var alpha:int = pixel32 >>> 24;
if (alpha != 0) {
sprite.graphics.beginFill(pixel32 & 0xFFFFFF, alpha / 0xFF);
sprite.graphics.drawRect(xPos, yPos, 1, 1);
sprite.graphics.endFill();
}
}
}
}
基本上你想要&#34;空&#34;不可点击的像素,完全透明的像素并不完全相同。使用此解决方案,您将获得空像素。
唯一的问题是这可能会很慢。试一试。