トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ビットマップの非透明部分でのみマウスイベントを受け取るには?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
chikamatsu
Åê¹ÆNo.42730
投稿日時: 2009-6-30 13:31
新米
居住地:
投稿: 3
使用環境:
Windows XP Pro,
Flash CS4,
FlashDevelop,
ビットマップの非透明部分でのみマウスイベントを受け取るには?
Flash CS4にてActionScript3を使って制作を行っています。

ゲームのキャラクターの様な、矩形内に不定形で塗りと透明部分がある場合に、
非透明の塗り部分でのみマウスイベントを受け取るにはどうしたらよいでしょうか?

現在、Sprite内に、透明部分を持ったPNGファイルを読み込んだBitmapを表示しています。
このSpriteに、例えばMouseEvent.CLICKを割り当てた場合、
内包するBitmapの透明度に関わらず、Spriteの矩形全体でイベントを検知してしまいます。

drawCircle()等で描いたベクターグラフィックであれば、透明部分はイベントを検知しませんが、
ビットマップ画像の透明部分で、MouseEvent.CLICKなどを使った同様の処理は可能なのでしょうか?
あるいは、通常のイベントリスナーでは不可能で、
BitmapData.hitTest()などで処理を行わなければならないのでしょうか。

Web上のFlashではごく一般的に見かける処理だったため、何故すんなりと行かないのか混乱しています。
恐らく何か基本を見落としているのだと思いますが、どうかよろしくお願いいたします。
野中文雄
Åê¹ÆNo.42731
投稿日時: 2009-6-30 15:10
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ビットマップの非透明部分でのみマウスイベントを受け取るには?
Sprite.hitAreaプロパティで、何とかなりますか?

参考:「ActionScript 3.0に対応したMovieClipのボタンをつくる
引用:
chikamatsuさんは書きました:
ゲームのキャラクターの様な、矩形内に不定形で塗りと透明部分がある場合に、
非透明の塗り部分でのみマウスイベントを受け取るにはどうしたらよいでしょうか?
...[中略]...
drawCircle()等で描いたベクターグラフィックであれば、透明部分はイベントを検知しませんが、
ビットマップ画像の透明部分で、MouseEvent.CLICKなどを使った同様の処理は可能なのでしょうか?


----------------
 

chikamatsu
Åê¹ÆNo.42732
投稿日時: 2009-6-30 15:48
新米
居住地:
投稿: 3
使用環境:
Windows XP Pro,
Flash CS4,
FlashDevelop,
Re: ビットマップの非透明部分でのみマウスイベントを受け取るには?
お返事ありがとうございます。

hitAreaを試してみました。
しかし別途Spriteが必要な点や、
複雑な形状の塗りへの対応が難しいなど、
考えていたものとは違いました。

Bitmapのアルファを基準にしたイベントの検知範囲を設ける、
というのは、物凄くポピュラーな処理だと感じてしまいます。
FlashではhitAreaのような指定を別途しなければ、
Bitmapに矩形以外の検知範囲を設けられないのでしょうか。
もしそうであれば、動的に大量のBitmapを取り扱う場合、
現実的な負荷でその様な検知範囲を設定する方法があれば、
ヒントだけでも教えていただけないでしょうか。

今の所思い浮かぶのは、
何らかの方法で対象Bitmapを元にhitArea用のSpriteを生成するか、
初めにも書いた、BitmapData.hitTest()を用いる方法です。

どうか、よろしくお願いいたします。
SeeDa!!
Åê¹ÆNo.42738
投稿日時: 2009-6-30 20:04
職人
居住地: Nagoya
投稿: 221
使用環境:
WinXP
Flash CS4
au:W33SA?
Re: ビットマップの非透明部分でのみマウスイベントを受け取るには?
引用:

chikamatsuさんは書きました:

hitAreaを試してみました。
しかし別途Spriteが必要な点や、
複雑な形状の塗りへの対応が難しいなど、
考えていたものとは違いました。


ヒントになるかどうか解りませんが、敢えて正攻法でない作戦をば…

PING画像に含まれない色(便宜上0xff00ff)のBitmapDataを用意して、そこにBitmap(透明部分を含むPING)をdrawします。
そしてhitTestではなくBitmapData.getPixelを使って0xff00ffかどうかを判断することにより、透明部分か否かを探ることができるような気がします。

// 透明PINGを試してないので、あくまでご参考に
永井勝則
Åê¹ÆNo.42742
投稿日時: 2009-6-30 22:33
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: ビットマップの非透明部分でのみマウスイベントを受け取るには?
オンラインヘルプを見ながら初めてBitmapData.hitTest()を使ってみたので、間違っているかもしれませんが、
当方のテストでは吉と出ています。
どんなもんでしょう?

var butaBMD:BitmapData=new ButaBMD(0,0);
var butaBM:Bitmap=new Bitmap(butaBMD);
addChild(butaBM);
butaBM.x=200;
butaBM.y=200;

stage.addEventListener(MouseEvent.CLICK, onClick);

function onClick(evt:MouseEvent):void {
	trace(butaBMD.hitTest(new Point(butaBM.x, butaBM.y), 255, new Point(mouseX, mouseY)));
}


----------------
永井勝則:
himco.jp :

chikamatsu
Åê¹ÆNo.42747
投稿日時: 2009-7-1 4:02
新米
居住地:
投稿: 3
使用環境:
Windows XP Pro,
Flash CS4,
FlashDevelop,
Re: ビットマップの非透明部分でのみマウスイベントを受け取るには?
SeeDa!!さん

ご提案の方法、確かに透明部分の判定が出来そうです。
ただ正攻法でないと仰るように、かなり使い難いと思います。
もし正攻法があるようでしたら、
どうかそちらのヒントをいただけませんでしょうか。

ただ今の所、他の情報を当たってみても、
「これぞ正攻法」言えそうなものの気配がありません…。
Bitmapのアルファを利用した処理については衝突検出が主で、
私が勝手に想像していたような、スマートな処理が無さそうです。

これはもうFlashの設計そのものが、Bitmapのアルファ値0を、
ベクターグラフィックスと同様には処理しないという事なんだろうと思います。
となると自前でBitmap用のイベントなりを作るしかなく、
その中では、教えていただいたgetPixel()が便利に使えそうな気がします。

--
knagaiさん

hitTest()を使ったコード、意図通りに動作しました。
また、そのままではoverやoutに対応できないので、
Spriteへのoverで、更にhitTest()をENTER_FRAMEイベントで受け取るようにしてみました。
これでマウス関連のイベントは一通りラッパーを書けそうです。

それにしても、FlashゲームにはBitmapを多用した作品が沢山あるのだから、
もっと根本的な何かを自分が見落としているような気がしてなりません…。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops