动作脚本3 - 只有在图像部分上单击鼠标时才可以触发点击事件吗?

时间:2012-03-03 13:00:08

标签: actionscript-3 occlusion

我有一个问题,我有潜在的解决方案。但我想确认是否有一种简单易行的方法来解决我的问题。

应用类型:

等距游戏

问题陈述:

我正在我的Flash应用程序中加载图像并附加了鼠标事件。

我加载的图像是道具图像,如车辆,树木,建筑物等,所有图像都是透明的。

示例:红球资产(请忽略我用来描述问题的黄色背景)

Red Ball Asset

如果我点击实际图像区域(红色),那么每件事情都很完美

当我点击空图像部分(或透明区域,我以黄色显示)时,我不想触发mouseevent

通过在Flash中创建蒙版,我知道了一种方法。我不想这样做,除非这是最后一个选项,因为我加载图片资源而不是flash资源而且我不喜欢我想为所有资产创建一个新的掩码资产

我将采用另一种方法来使用Bitmap的getPixel方法。讨论了here

但这种方法存在另一个问题。

当我点击资产的空白部分时,我可能会忽略点击事件,但如果在同一位置的图像后面有其他资产,那么我需要处理被遮挡图像的点击事件

好吧,考虑解决这个问题需要我去getObjectsUnderPoint我可以扫描被遮挡的资产

2 个答案:

答案 0 :(得分:2)

那么,您提出的解决方案是100%有效。只需移动确定在该对象之外点击哪个游戏对象的逻辑。

  1. 在包含游戏对象的容器中侦听MOUSE_DOWN/MOUSE_UP个事件。
  2. 抓住活动
  3. 使用BitmapData.getPixel32
  4. 检查此时此目标的目标游戏对象是否透明
  5. 如果此时使用getObjectsUnderPoint来查找所有其他游戏对象
  6. 在循环中查找此时不透明的第一个对象
  7. 现在你得到了被击中的实际对象。

答案 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;不可点击的像素,完全透明的像素并不完全相同。使用此解决方案,您将获得空像素。

唯一的问题是这可能会很慢。试一试。