2

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

应用类型:

等距游戏

问题陈述:

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

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

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

红球资产

如果我点击实际的图像区域(红色),那么一切都很完美

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

我知道一种方法是在 Flash 中创建蒙版。我不想这样做,除非那是最后的选择,因为我加载图像资产而不是 Flash 资产,并且我不想为所有资产创建新的蒙版资产

我将采用另一种方法,即使用 Bitmap 的 getPixel 方法。这里讨论。

但是这种方法还有另一个问题。

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

好吧,考虑到这个问题的解决方案将我带到了getObjectsUnderPoint,在那里我可以扫描被遮挡的资产

4

2 回答 2

2

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

  1. MOUSE_DOWN/MOUSE_UP在包含您的游戏对象的容器中侦听事件。
  2. 赶上一个事件
  3. 检查作为此事件目标的游戏对象此时是否是透明的BitmapData.getPixel32
  4. 如果getObjectsUnderPoint此时用于找出所有其他游戏对象
  5. 在循环中查找此时不透明的第一个对象

现在你得到了被击中的实际对象。

于 2012-03-03T16:20:46.087 回答
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();
            }
        }
    }

}

本质上,您想要不可点击的“空”像素,而完全透明的像素并不完全相同。使用此解决方案,您将获得空像素。

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

于 2012-03-03T16:17:46.750 回答