2012-03-03 6 views
2

私には問題があり、潜在的な解決策があります。しかし、問題を解決するための簡単で簡単な方法があるかどうかを確認したかったのです。アクションスクリプト3 - 画像部分でマウスをクリックしたときだけクリックイベントをトリガーすることは可能ですか?

アプリケーションの種類:

問題文の

アイソメトリックゲーム:私は私のフラッシュアプ​​リで画像をロードし、それらに添付のマウスイベントを持っています

私がロードする画像は、車両、木、建物などのプロップ画像であり、すべてが透明です。

例:赤いボール資産はその後、すべて、私は実際の画像領域をクリックすると(赤に着色)

Red Ball Asset

(私は、問題を記述するために適用される黄色の背景を無視してください)事は

完璧な作品私は

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

フラッシュでマスクを作成することで私が知る1つの方法があります。フラッシュアセットの代わりにイメージアセットを読み込み、すべてのアセットに新しいマスクアセットを作成したくないため、最後のオプションが残っていない限り、やりたくありません。

BitmapのgetPixelメソッドを使って採用しようとしていました。これについては、hereを参照してください。

しかし、この方法には別の問題があります。

アセットの空いている部分をクリックしたときにクリックイベントを無視することはできますが、他のアセットが同じ場所の画像の後ろにある場合は、閉塞された画像。

さて、この問題に対する解決策の考え方は、私を取るgetObjectsUnderPoint私は、閉塞した資産をスキャンすることができます

+0

hitAreaプロパティを調べることもできます。私はそれがあなたのケースのマスクより優れているかどうか分からないので、私は答えではなくコメントにしますが、少なくともそれは問題に関連しています:http://help.adobe.com/en_US/FlashPlatform /reference/actionscript/3/flash/display/Sprite.html#hitArea –

+0

なぜ画像アセットの代わりにフラッシュアセットを使用するのですか?画像ごとにカスタマイズ(不要な透明ピクセルをカットするなど)し、swfとしてエクスポートします。または、資産のswfライブラリを作成します。 – Engineer

+0

私は、Facebookのすべての仮想ゲームが実行時にダウンロードされるようにコーディングされていると確信しています。私はHTTPスニファーでそれを観察しました。私が思うと、そのゲームは使用されないswfのすべての資産をバンドルする代わりに、より良いオプションです。 –

答えて

1

一つの興味深いソリューションは、それらの上に焼け個々の非透明ピクセルとSpriteオブジェクトを使用することです。

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(); 
      } 
     } 
    } 

} 

は基本的にあなたがクリックできない「空」のピクセルをしたい、と完全に透明なピクセルは全く同じものではありません。

が、これはあなたのLoader「完了」ハンドラであると仮定します。このソリューションを使用すると、空のピクセルが得られます。

これは遅いかもしれないという点のみです。試してみます。

+4

@ValentinSimonov "This is stupid"は役に立つコメントではありません。なぜそれがばかだと説明してください。 – Manish

+0

はるかに良い解決策が存在するためです。 –

+0

多くの資産をロードすると、メモリとCPUが消費されます。 – turbosqel

2

あなたが解決策として提案したものは、100%有効です。そのオブジェクトの外側でどのゲームオブジェクトがクリックされたかを判断するロジックを動かすだけです。

  1. ゲームオブジェクトを含むコンテナでMOUSE_DOWN/MOUSE_UPイベントを聞きます。
  2. キャッチイベント
  3. チェック、それは検索
  4. この時点で、他のすべてのゲームオブジェクトを見つけるためにgetObjectsUnderPointを使用している場合は、このイベントのターゲットであるゲームオブジェクトは、BitmapData.getPixel32
  5. を使用して、この時点では透明である場合ループ内でこの時点で透明でない最初のオブジェクト

これで、実際のオブジェクトが得られました。

+0

ユーザーがオブジェクトをクリックするたびに、複数のオブジェクトに対してBitmapData.draw()を実行し、適切なオブジェクトを見つけるためにおそらくlocalToGlobal()およびglobalToLocal()を実行する必要がありますか?毎回?あなたは私の解決策を愚かと呼びますか?脱帽。あなたは私たちにいくつかのコードを見せてどうですか? – Manish

+0

彼はビットマップを使用します。ビットマップには 'bitmapData'プロパティがあります。 –

+0

彼はBitmapオブジェクトで作業することはできません。なぜなら、それらは最初にクリック可能ではないからです。彼は "実行時にダウンロード"と言うので、彼は 'Loader'オブジェクトを使っていると思います。 – Manish

関連する問題