WOLF RPGエディター(ウディタ)[3.650]/演出・システム【サイトトップへ戻る】
■画像ファイルのアルファ値で当たり判定を処理
(更新:2025/10/18)


画像ファイルのアルファ値(不透明度)を取得して、当たり判定を処理する方法を紹介します。


ショートカット
■四角形の当たり判定とアルファ値の当たり判定を比較
■画像ファイルからアルファ値を取得する方法
■アルファ値の当たり判定は万能ではない
■動作確認用のコモンイベント


  
■四角形の当たり判定とアルファ値の当たり判定を比較

弾丸を当てるシューティングゲームの当たり判定を作る場合、
通常はターゲットの画像に弾丸の画像が重なったらダメージ(弾丸は消去)と言った処理を作ります。

しかし下図のように透明な部分が多くある場合は、
単に「画像同士が重なった」では、ターゲットから離れた位置でも「当たった」となってしまいます。

▼水色の部分と弾丸が重なった瞬間に「当たった」と判定されてしまう


このような透明な部分が多い画像の当たり判定を処理する場合は、
当たり判定を処理する部分を指定する必要があります。



■四角形の当たり判定

下図は当たり判定の範囲を四角形で設定した時の設定例です。

▼赤い部分が当たり判定の範囲となる


1つの四角形で当たり判定を設定すると、
羽や尻尾などのはみ出した部分が当たり判定の範囲外になったり、
画像の右下にある広く透明な部分が当たり判定の範囲内になったりします。

より画像内容に合わせた当たり判定を設定する場合は、
下図のように四角形の当たり判定の数を増やす必要があります。

▼四角形の当たり判定を10箇所に増やした時


四角形の当たり判定の数を増やすと、より細かい当たり判定の範囲を設定する事ができますが、
しかし四角形の当たり判定の数が増えれば増えるほど、処理負担が大きくなります。

例えば「弾丸100発 × 敵10体(敵1体で当たり判定10箇所)」の場合は、
1フレームごとに最大で1万箇所の当たり判定を処理する事となり、
処理落ちなどの問題が発生しやすくなります。

また画像ごと(敵キャラごと)に独自の四角形の当たり判定を設定する必要があり、
その準備に手間と時間がかかります。



■アルファ値の当たり判定

アルファ値(不透明度)の当たり判定は、
画像ファイルから指定した座標(弾丸がある座標)のアルファ値を取得し、
アルファ値が1以上の時(透明ではない時)に「当たった」と判定します。

四角形の当たり判定とは異なり、事前に当たり判定の範囲を設定しておく必要はありません。

また1ピクセル単位の細かい当たり判定を行う事ができるため、
例えば下図の赤い矢印が示す数ピクセルの幅しかない羽の先端でも、ちゃんと当たり判定が機能します。



羽や尻尾などを動かすアニメーションを行った場合は、
そのアニメーションの動きに合わせて、当たり判定の範囲を変化させる事ができます。

欠点としては、四角形の当たり判定と比べると様々な制約があり、
またイベント設定が複雑化する場合があります。
詳しくは下記にある■アルファ値の当たり判定は万能ではないをご覧ください。


▲トップへ戻る▲


  
■画像ファイルからアルファ値を取得する方法

弾丸がある位置のアルファ値を取得する場合は、まず弾丸が画像の上にあるかどうかを調べます。



弾丸が画像の上に無い場合は、この時点でこの弾丸の当たり判定の処理を中止します。



弾丸が画像の上にある場合は、画像の左端と上端から弾丸までの距離を測ります。





距離を測ったら、イベントコマンド【文字列操作】の「隠しコード」の
<<GET_IMAGE_ARGB_X=弾丸までの距離X/Y=弾丸までの距離Y>>敵画像のファイルアドレス
を使って、弾丸がある位置のアルファ値を文字列変数の1行目に保存します。
※文字列変数の2〜4行目にはR値、G値、B値が保存されています。

取得したアルファ値は、
アルファ値「0」=透明
アルファ値「1以上」=不透明
となっているため、「1以上」だった場合は「当たった」と判断します。

なお「1以上」ではなく「20以上」などで処理すると、
画面上では認識し辛い不透明度[1〜19]の半透明の部分を「当たっていない」と処理する事ができます。


▲トップへ戻る▲


  
■アルファ値の当たり判定は万能ではない

アルファ値の当たり判定は、あくまで当たり判定の処理方法の1つに過ぎず、
万能な処理方法と言う訳ではありません。



以下の表には、アルファ値の当たり判定のデメリットな部分を記載しています。

■四角形+アルファ値

アルファ値を取得する前に、
弾丸などの対象物が画像の上に乗っているかどうかを調べる四角形の当たり判定が必要です。
そのため「四角形+アルファ値」の処理になるため、
1つの四角形だけで当たり判定を処理するよりも、処理負担が大きくなります。
■どこに当たったのかが判別できない

羽には当たり判定を付けたくない」「羽に当たったらダメージ2倍」など、
当たった場所によって処理内容を変えたい時には、羽と本体を別々の画像で表示したり、
弾丸の座標位置から当たった場所を判定したり、四角形などの他の当たり判定を併用したりと、
設定方法を工夫する必要があります。
■複数の画像を繋ぎ合わせて表示している場合は、
 画像ごとに当たり判定を処理する必要がある


頭、体、腕、足などを別々の画像で表示して、
それらを繋ぎ合わせて1体のキャラクターを表示している場合は、
四角形ではまとめて1つの当たり判定で処理する事もできますが、
アルファ値では画像ごとに1つずつ処理する必要があります。
■少し大きめに当たり判定の範囲を設定したい時には、
 画像ファイルの修正などが必要




上図の赤い部分(通常は透明と判断される部分)にも当たり判定を設定したい場合は、
赤い部分のアルファ値を「1以上」にする画像ファイルの修正が必要です。

アルファ値を変えずに透明な部分に当たり判定を設定したい場合は、
ゲーム画面に表示する画像ファイルとは別に、
赤い部分のアルファ値を「1以上」にした当たり判定用の画像ファイルを用意する必要があります。
■画像ファイルに複数の画像パターンが保存されている場合は、
 イベント設定が複雑化する


例えば横80ピクセルの画像が
横に3個並んで保存されている画像ファイルでアルファ値を取得する場合は、
パターン1を表示中 → X+0
パターン2を表示中 → X+80
パターン3を表示中 → X+160

と言ったように、ゲーム画面上に表示されているパターンに合わせて、
アルファ値を取得する座標位置を変える必要があります。
■ピクチャの表示内容によっては対応する事ができない

文字列やお気軽ウィンドウで表示した図形の場合は、
画像ファイルを使わずに表示しているため、アルファ値を使った当たり判定が使えません。

またお気軽ウィンドウでウィンドウ画像を表示した場合は、
画像ファイルのサイズとゲーム画面上に表示したサイズが異なるため、
そのまま画像ファイルからアルファ値を取得しても、正常に処理する事ができません。

拡大率を変えたり、角度を変えたりして表示している場合は、
拡大率100%&角度0度の時の座標でアルファ値を取得する必要があります。



四角形とアルファ値のどちらの処理が良いのかは、処理する内容によっても変わってきます。

例えば主人公やマップイベントの当たり判定をアルファ値で設定する場合は、
以下のような問題が発生します。

現在の向きや歩行アニメのパターンに合わせて、
キャラチップの画像ファイルからアルファ値を取得する座標位置を変える必要があるため、
複雑なイベント設定が必要であり、処理負担が大きくなる。

▼左向き+パターン3の場合は、黄色の所のアルファ値を取得する必要がある
足踏みアニメの表示タイミングによって、
同じ位置への攻撃でも攻撃が当たったり当たらなかったりする。

▼当たる
▼当たらない
画像サイズが小さく、凹凸も少ないため、
1つの四角形の当たり判定で処理した時と、見た目の処理結果が殆ど変わらない。

上記の仕様を見る限り、普通に1つの四角形の当たり判定で処理した方が良いと言えるでしょう。



アルファ値の処理は、必ずしも「他の当たり判定よりも優れている」と言う訳ではなく、
単に当たり判定の処理方法の1つに過ぎません。


▲トップへ戻る▲


  
■動作確認用のコモンイベント

動作確認用のコモンイベントを用意しました。

【クリックしてコモンイベントをダウンロードする】

ダウンロードしたら、右クリック→「すべて展開」で圧縮データを解凍し、
ファイル「アルファ値の当たり判定.common」をウディタのコモンイベントに読み込んでください。

そしてテストプレイを実行し、右クリックで動作確認用のコモンイベントを起動してください。

▼動作イメージ(マウスポインタの位置から8方向に弾丸を発射した時)


アルファ値の当たり判定の設定方法は、動作確認用のコモンイベントの中を見て確認してください。


▲トップへ戻る▲



◎関連ページ

◆画像の当たり判定について
┗◆画像ファイルのアルファ値で当たり判定を処理

YADOT-WOLFトップ  気紛れな空間へ戻る  メール