btransはどこから反応するか。
タイトル通り。bexec系命令の一部、btransは、スプライトをボタンにした時、スプライトの透明部分はボタンから排除すると言う宣言的命令です。
実際にどの程度の透明度(不透明度)までを透明とみなすのか、調査してみました。
結論を先に
不透明度が0〜14までの間ならば、それは透明とみなしてボタンとはみなさない。
表にしてみる。
反応 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 無 | 有 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
不透明度 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
不透明度(16進数) | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
透明度 | 255 | 254 | 253 | 252 | 251 | 250 | 249 | 248 | 247 | 246 | 245 | 244 | 243 | 242 | 241 | 240 | |
透明度(16進数) | FF | FE | FD | FC | FB | FA | F9 | F8 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | ※色指定に使う |
つまり、マスク画像の色が#FFFFFFから#F0F0F0までは透明扱いされる訳です。
なお、btrans命令はマスク画像による色指定のみを見るので、mspやamspで指定するスプライトの不透明度がいくらであっても関係がないです。
これを利用して、マスク画像によって矩形以外の形のボタンを作り、そのスプライトの不透明度を0にしてからボタン化すると、不可視のボタンが作成できます。
検証スクリプト
まず、マスク画像を作成します。
一番左端が#FFFFFFで、そこから1ドットにつき1段階黒に近づいていき、左から256番目のドット以降は全て#000000になります。
それを作成したスクリプトはこちら。
*define game *start for %0=0 to 15 if %0<10 itoa $0,%0 if %0=10 mov $0,"a" if %0=11 mov $0,"b" if %0=12 mov $0,"c" if %0=13 mov $0,"d" if %0=14 mov $0,"e" if %0=15 mov $0,"f" for %1=0 to 15 if %1<10 itoa $1,%1 if %1=10 mov $1,"a" if %1=11 mov $1,"b" if %1=12 mov $1,"c" if %1=13 mov $1,"d" if %1=14 mov $1,"e" if %1=15 mov $1,"f" mov %3,255-%0*16-%1 mov $3,":c;>1,480,#"+$0+$1+$0+$1+$0+$1 lsp %3,$3,%3,0 next next print 1 getscreenshot 640,480 savescreenshot "mask.bmp" end
作成されたbmpをpngに変換するのはお好みで。
そして、それを使った検証スクリプトは以下。
*define game *start lsp 0,":mmask.bmp;>256,480,#000000",0,0 print 1 movemousecursor 0,0 mov %50,0 *loop itoa2 $50,%50 lsph 100,":s/36,36,0;#FFFFFF"+$50,400,0 movemousecursor %50,0 bclear btrans bsp 0,"P100","C100","" btime 100 bexec $0,%0 getspmode %25,100 if %25=0 mesbox $50,"表示されなくなった最初の数値":jumpf inc %50 if %50>255 jumpf goto *loop ~ click end
このスクリプトによって、不透明度が15の時に初めてボタンとしてみなされることがわかる。