【ウディタ講座】マウスカーソルを自作化する

ウディタ上のマウスカーソルを自作画像に差し替える

マウス対応のウディタゲーを作るつもりなら、やってみたくなるのがカーソルの自作化。
システム変数という変わった変数を使いますが、むずかしいことはありませんね。

 

コモンイベント 並列実行(常時)
■変数操作: Sys74:マウスポインタ表示する?(1=ON) = 0 + 0
■変数操作: CSelf10[X位置] = Sys71:マウスX位置 + 0
■変数操作: CSelf11[Y位置] = Sys72:マウスY位置 + 0
■ピクチャ表示:1 [中心]ファイル「Picture/FaceGraphic_Yuichi.png」 X:CSelf10[X位置] Y:CSelf11[Y位置] / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[150] G[70] B[70]

 

Sys74:マウスポインタ表示する?(1=on) という変数に0を代入してカーソルを非表示。見えないだけで、あることはありますから、Sys71:マウスX位置Sys72:マウスY位置でその座標を取得し、そこに自分で用意した画像を表示してください。

適当なカーソル画像がなかったので、今回は夕一にカーソルになってもらいました。赤っぽい方。

 

が、ちょっとだけ気になることがあります。

これ。左下に夕一(カーソル)のおしりが見えてますね。

どういうことかと言いますと、本当のマウスカーソルがウディタの画面の外に出て行って、夕一が置いていかれて、はぐれてしまっています。本当のマウスカーソルはもっと左下、画面外にあるのです。

マウスカーソルが画面外にあるかどうかの判定

夕一はぐれ問題、気にならない人には気にならないかもしれませんが、気になる人にとってはどうにかしたいこと。そこで「マウスカーソルがゲーム画面(ウィンドウ)の上にあるかどうか」の判定が超大事になってくるわけです。

ところが、カーソルが画面外にあるかどうか、ウディタは一発で判定できません。

システム変数でマウスの座標を拾っているし、テストプレイ中のタイトルバーでもマウスの座標は出ているんだから、画面外かの判定はシステム変数でちゃんとできるはずなのでは……?

という具合に大変悩んだものです。

実はここ、ウディタの仕様がちょっと特殊。

カーソル変更のコモンに処理を足してみましょう。デバッグ文を使ってマウスの座標を確認できるようにして、カーソルが画面外のときは夕一の画像を消すようにしました。

 

■変数操作: Sys74:マウスポインタ表示する?(1=ON) = 0 + 0
■変数操作: CSelf10[X位置] = Sys71:マウスX位置 + 0
■変数操作: CSelf11[Y位置] = Sys72:マウスY位置 + 0
■ピクチャ表示:1 [中心]ファイル「Picture/FaceGraphic_Yuichi.png」 X:CSelf10[X位置] Y:CSelf11[Y位置] / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[150] G[70] B[70]
▼ 【新・マウスカーソル画面外判定】
■条件分岐(変数): 【1】 CSelf10[X位置] が 0 未満 【2】 CSelf10[X位置] が 320 超
-◇分岐: 【1】 [ CSelf10[X位置] が 0 未満 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
-◇分岐: 【2】 [ CSelf10[X位置] が 320 超 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
◇分岐終了◇
■条件分岐(変数): 【1】 CSelf11[Y位置] が 0 未満 【2】 CSelf11[Y位置] が 240 超
-◇分岐: 【1】 [ CSelf11[Y位置] が 0 未満 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
-◇分岐: 【2】 [ CSelf11[Y位置] が 240 超 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
◇分岐終了◇
■デバッグ文の全消去
■デバッグ文:マウス座標(\cself[10],\cself[11])

 

サンプルゲームのゲーム画面サイズは320×240ですから、xが0未満か320超のとき、yが0未満か240超の時が、カーソルが画面外にあるということになります。

結果はというと、現時点のver2.24では、うまく行きません。

 

なぜなのか。実は、システム変数で取得したマウス座標が、テストプレイのタイトルバーの表示と食い違っているんです。

タイトルバーで座標を見るにはF8を入力してくださいね。

どちらも同じ結果が出そうなものですが、ゲーム画面のタイトルバーは(-48,258)で、デバッグ文で表示しているシステム変数の値は(0,240)です。

システム変数のマウス位置とはウィンドウ内の座標のこと

どうやら、ゲーム画面サイズが320×240なら(0,0)~(320,240)しか、システム変数のマウス座標では拾えない仕様となっているようです。

なぜそうなっているのかはわかりませんが、ウディタの仕様がこうわかれば、少しの割り切りでなんとかできそうです。

夕一を消すことが。

座標を見る分岐部分を、次のように書き換えます。

▼ 【新・マウスカーソル画面外判定】
■条件分岐(変数): 【1】 CSelf10[X位置] が 0 以下 【2】 CSelf10[X位置] が 320 以上
-◇分岐: 【1】 [ CSelf10[X位置] が 0 以下 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
-◇分岐: 【2】 [ CSelf10[X位置] が 320 以上 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
◇分岐終了◇
■条件分岐(変数): 【1】 CSelf11[Y位置] が 0 以上 【2】 CSelf11[Y位置] が 240 以下
-◇分岐: 【1】 [ CSelf11[Y位置] が 0 以上 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
-◇分岐: 【2】 [ CSelf11[Y位置] が 240 以下 ]の場合↓
|■ピクチャ消去:1 / 0(0)フレーム
|■
◇分岐終了◇

はい、これで夕一が消えるはずです。

なにが変わったかというと、「未満」を「以下」に、「より大きい」を「以上」にしただけです。

つまり、画面ぎりぎり端はもう画面外として扱っているわけです。

ゲーム画面サイズ(解像度)が320×240なら(0,0)~(320,240)までは拾えるわけですから、画面のキワの1ドットの範囲を画面外とみなすことで、「本来のカーソルが画面外に出たとき、ゲーム用カーソルも消える」処理が実現します。

マウス座標の1ドットは本当に小さな範囲ですから、違和感なく操作していけるはずです。