2

私には問題があり、潜在的な解決策があります。しかし、私の問題を解決する簡単で簡単な方法があるかどうかを確認したかった.

アプリの種類:

等尺性ゲーム

問題文:

フラッシュ アプリに画像を読み込んでいて、マウス イベントが添付されています。

読み込む画像は、乗り物、木、建物などのプロップ画像で、すべて透明です。

例: 赤いボール アセット(問題を説明するために適用した黄色の背景は無視してください)

レッドボールアセット

実際の画像領域 (赤で表示) をクリックすると、すべてが完璧に機能します。

空の画像部分 (または黄色で表示されている透明な領域) をクリックしたときに、mouseevent をトリガーしたくありません。

フラッシュでマスクを作成する方法が 1 つあります。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

興味深い解決策の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 に答える