2016-03-06
選択肢の怪
選択肢表示状態の時、何故か一部分だけ、マウスを認識せず、選択肢の色が変わらず、クリックしても次へ飛ばない部分があったり、逆に勝手に選択されてしまうなどの怪現象があり、これは当初、動的に作成した部品を壊すとエラーが出まくるために、壊さないで済ましていたことが原因で、新たに覚えた「VCL_FREE」のまじないを追加したら直った! と思っていたのですが、なんかやっぱりおかしな時がある・・・?
行き詰まった時には、現場に戻……ではなくて、初心に立ち返り、問題点を明確にすることが必要です。
と、いうわけで――
一体どーゆう現象かというと、以下のようなサンプルシナリオを実行すると、
#,選択肢の怪を確認するサンプルシナリオ #,-------------------------------------------------------- #, ビジュアルノベル風 #,-------------------------------------------------------- $,テキストウィンドウサイズ,640,120 $,テキストウィンドウ表示位置,0,360 $,テキストウィンドウ半透明,0,0,640,120,50 $,テキストウィンドウ色,$000077 $,メッセージ書式,MS ゴシック|20|太字,$FFFFFF,$000000,3 $,メッセージ表示位置,15,15 $,メッセージ速度,10 $,行間,0 $,ブリンク表示,600,445,300 $,選択肢表示位置固定,オン $,選択肢表示,15,375,600,0 #,-------------------------------------------------------- !,背景,北竜.jpg !,立ち絵ロード,立ち絵.bmp !,立ち絵オン,,70 !,テキストウィンドウオン !,選択肢,2 -,1234567890,A -,1234567890,B *,A Aへとんだよ *,B Bへとんだよ #,注:はてなでは、「-」や「*」が特別なヘッダーみたいで表示が変になっちゃうから頭に半角スペースを入れてるけど、実際には行頭。
こういう画面になります。
ここまでは、正しい。
さて、これは選択肢なんで、マウスカーソルを合わせると、上の「1~0」のように反転し、クリックするとラベルに飛ぶわけ。
ところが、どーゆうわけか、「4、5」の辺りだけ、マウスを認識しないんだよね。
それ以外の場所では問題なく反転もするし、ジャンプもするとゆう、まさに謎の怪現象なんだよ!
まあ、そこに目をつぶれば、ふつーに動作はするのだけど、だから、どってこと無い些細な問題と言えばそうなんだけど、一度気になったからには、どうしても気になるっ。
ナゾ解明しないことには、気持ち悪い。
この選択肢は、初期の頃に試行錯誤しながら作った無理矢理感満載のマウスオーバーボタンをそのまま流用しているから、間違いが無いとも言い切れないけど、他のやつで今まで問題が出たことはないんだよね。
#-------------------------------------------------------------- # マウスオーバーボタン #-------------------------------------------------------------- #-----母艦設計-------------------------------------------------- !母艦設計=「母艦の可視はオフ」 母艦のタイトルは「マウスオーバーボタン」 母艦を$FFFFFFで画面クリア。 母艦のスタイルは「枠固定」 母艦はオフに最大化ボタン有効変更。 母艦のクライアント幅は640。母艦のクライアント高さは480。 母艦を中央移動 母艦の可視はオン。 #-------------------------------------------------------------- #-----ボタン準備------------------------------------------------ ボタン幅とは整数=600。 ボタン高さとは整数=40。 ボタン位置Xとは整数=20。 ボタン位置Yとは整数=50。 ボタン間隔とは整数=20。 ボタン数とは整数=6 文字書体は「MS ゴシック|14|標準」。 裏画面とはイメージ。その可視はオフ。 その幅はボタン幅*2。その高さはボタン高さ*ボタン数 #なんか画像を用意すればかっこいいんだけど、とりあえずボタンの画像を書いている。 #左側が通常時のボタンで、右側がマウスオーバー時のボタンとなる。 (ボタン数)回 塗り色は$AAAAAA 裏画面の0,(回数-1)*ボタン高さからボタン幅,回数*ボタン高さへ四角。 裏画面の25,(回数-1)*ボタン高さ+10へ「マウスオーバーボタン{回数}」を文字描画。 塗り色は$FFAAAA 裏画面のボタン幅,(回数-1)*ボタン高さからボタン幅*2,回数*ボタン高さへ四角。 裏画面のボタン幅+25,(回数-1)*ボタン高さ+10へ「マウスオーバーボタン{回数}」を文字描画。 #-------------------------------------------------------------- #-----ボタンを設定---------------------------------------------- 選択肢とは配列。 #0ボタン表示位置X、1ボタン表示位置Y、2ボタン幅、3ボタン高さ (ボタン数)回 選択肢¥回数,0はボタン位置X 選択肢¥回数,1はボタン位置Y+(回数-1)*(ボタン高さ+ボタン間隔) 選択肢¥回数,2はボタン幅 選択肢¥回数,3はボタン高さ #-------------------------------------------------------------- #-----ボタンを描画------------------------------------------------------ 裏画面の0,0を選択肢で母艦へマウスオーバーボタン表示 #----------------------------------------------------------------------- #----マウス入力待ち---------------------------------------------- 母艦のマウス移動した時は~ 裏画面の選択肢を母艦へマウスインアウト反映。 母艦のマウス押した時は~ もし、前選択ボタン=0でなければ 「ボタン{前選択ボタン}をクリック」と言う #-------------------------------------------------------------- #-------------------------------------------------------------- ●マウスオーバーボタン表示({グループ=?}OBJ1のX,YをAで{グループ=?}OBJ2へ) A\0,0=X。A\0,1=Y (Aの要素数-1)回 OBJ1のX,Y+(回数-1)*(A¥回数,3),(A¥回数,2),(A¥回数,3)をOBJ2の(A¥回数,0),(A¥回数,1)へ画像部分コピー。 ●マウスインアウト反映({グループ=?}OBJ1のAを{グループ=?}OBJ2へ) (Aの要素数-1)回 もし、((OBJ2→マウスX)>(A¥回数,0))かつ ((OBJ2→マウスX)<(A¥回数,0)+(A¥回数,2))かつ ((OBJ2→マウスY)>(A¥回数,1))かつ ((OBJ2→マウスY)<(A¥回数,1)+(A¥回数,3))ならば 選択ボタンは回数。 違えば、もし、(回数=Aの要素数)かつ(選択ボタン=0)ならば 選択ボタンは0。 ここまで もし、前選択ボタン<>選択ボタンならば もし、前選択ボタン>0ならば OBJ1の(A\0,0),(A\0,1)+(前選択ボタン-1)*(A¥(前選択ボタン),3),(A¥(前選択ボタン),2),(A¥(前選択ボタン),3)をOBJ2の(A¥(前選択ボタン),0),(A¥(前選択ボタン),1)へ画像部分コピー。 もし、選択ボタン>0ならば OBJ1の(A\0,0)+(A¥(選択ボタン),2),(A\0,1)+(選択ボタン-1)*(A¥(選択ボタン),3),(A¥(選択ボタン),2),(A¥(選択ボタン),3)をOBJ2の(A¥(選択ボタン),0),(A¥(選択ボタン),1)へ画像部分コピー。 前選択ボタン=選択ボタン 選択ボタン=0 描画処理反映 #--------------------------------------------------------------
要するに、左側に通常時のボタン画像、右側にマウスオーバー時のボタン画像を並べた裏画面を用意して、配列に指定したボタン設定に基づいて画像部分コピーしてるんだよね。
いちおう、ノベルの選択肢に合わせて、ボタンの幅を長~くしてみて色々ためしたけど、このサンプルプログラムではマウスの認識に問題のある箇所は見当たらなかった。
選択肢として表示したものをコピーして、都度ボタン化したりしていて、確かにこのサンプルとは少し変わっている部分もあるんだけど、それにしても肝心の、マウスの出入りは、「マウス移動した時~」の座標を単純に取って、「ボタン表示位置X、ボタン表示位置Y、ボタン幅、ボタン高さ」から、ボタンの中にマウスが入ったかどうかを判断しているだけで、どう考えても、ボタンの中の一部分にだけ抜けが生じるようなものには思えないんだけど・・・むむむ。