2011年03月31日のツイート

2011年03月31日のツイート

2011年03月31日のツイート

2011年04月01日のツイート

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

作成されたbmppngに変換するのはお好みで。
そして、それを使った検証スクリプトは以下。

*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の時に初めてボタンとしてみなされることがわかる。

もし、マスク画像に彩度0以外の画像を使ったらどうなるか

マスク画像部分は、通常白〜灰色〜黒までのどれかのみで構成されていることを期待されています。
で、あえて彩度が0を超える(=赤・緑・青の数値が均一でない)色を指定した場合どうなるかを試してみました。

結論を先に

透過不透過の判断は、青の強さのみが影響している。他、赤と緑の強さがどうであろうとも、透過不透過には関係がない。

検証

下記の画像をマスク画像として使ってみれば一目瞭然。
赤と緑の場合は、マスク画像の体をなさないが、青の場合のみグラデーションがかかる。


もし、マスク画像に彩度0以外の画像を使ったらどうなるか

マスク画像部分は、通常白〜灰色〜黒までのどれかのみで構成されていることを期待されています。
で、あえて彩度が0を超える(=赤・緑・青の数値が均一でない)色を指定した場合どうなるかを試してみました。

結論を先に

透過不透過の判断は、青の強さのみが影響している。他、赤と緑の強さがどうであろうとも、透過不透過には関係がない。

検証

下記の画像をマスク画像として使ってみれば一目瞭然。
赤と緑の場合は、マスク画像の体をなさないが、青の場合のみグラデーションがかかる。


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

作成されたbmppngに変換するのはお好みで。
そして、それを使った検証スクリプトは以下。

*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の時に初めてボタンとしてみなされることがわかる。

2011年04月01日のツイート

もし、マスク画像に彩度0以外の画像を使ったらどうなるか

マスク画像部分は、通常白〜灰色〜黒までのどれかのみで構成されていることを期待されています。
で、あえて彩度が0を超える(=赤・緑・青の数値が均一でない)色を指定した場合どうなるかを試してみました。

結論を先に

透過不透過の判断は、青の強さのみが影響している。他、赤と緑の強さがどうであろうとも、透過不透過には関係がない。

検証

下記の画像をマスク画像として使ってみれば一目瞭然。
赤と緑の場合は、マスク画像の体をなさないが、青の場合のみグラデーションがかかる。


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

作成されたbmppngに変換するのはお好みで。
そして、それを使った検証スクリプトは以下。

*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の時に初めてボタンとしてみなされることがわかる。

2011年04月01日のツイート

2011年04月02日のツイート

2011年04月02日のツイート

2011年04月02日のツイート

2011年04月03日のツイート

2011年04月03日のツイート

2011年04月03日のツイート

2011年04月04日のツイート

2011年04月04日のツイート

2011年04月04日のツイート

2011年04月05日のツイート

bexecの非bcursor時の動作検証

bexecで待機中、bcursorを実行していない場合、カーソルキーによりボタンスプライト間をマウスカーソルが移動するのは仕様です。
この時、移動する先は、選ばれたスプライト(ボタン領域)の中心点になります。
では、仮に、スプライトの中心が画面の外になるような位置にセットし、それをボタン化、カーソルキーで操作してみたらどうなるか。
結論としては、マウスカーソルはその位置に移動しますが、nscr.exeの作るウィンドウから外れてしまいますので、それ以上は何も起こらないことになります。

検証用スクリプト

*define
deletemenu
game
*start

lsp 100,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,0
lsp 101,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,100
lsp 102,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,200
lsp 103,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,300
lsp 104,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,400

bclear
bsp 100
bsp 101
bsp 102
bsp 103
bsp 104
bexec $0,%0
mesbox $0,"押されたもの"
end

カーソルを動かしてみてください。

movemousecursorの挙動

マウスカーソルの位置を指定した場所に動かすmovemousecursor命令には、動かしたい位置のx座標とy座標を引数として与えます。
この時、マイナスや大きな値を与えると、画面外にマウスを動かすことができます。
bexecの非bcursor時の動作検証 - 永字八法のカーソルキーの挙動も、内部的にはこれを使っていると思われます。
それはともかく、実際のゲーム的にはイタズラくらいにしか使い途を思いつきませんが。

検証用スクリプト

*define
deletemenu
game
*start

mov %0,320
mov %1,240

rnd2 %2,-5,5
rnd2 %3,-5,5

終了する時はESCを押してください。

*loop

movemousecursor %0-80,%1-60

add %0,%2
if %0<0 mov %0,0-%0:mov %2,0-%2
if %0>799 mov %0,1600-%0:mov %2,0-%2

add %1,%3
if %1<0 mov %1,0-%1:mov %3,0-%3
if %1>599 mov %1,1200-%1:mov %3,0-%3

bclear
btime 10
bexec $100
if $100="ESC" end
goto *loop

movemousecursorの挙動

マウスカーソルの位置を指定した場所に動かすmovemousecursor命令には、動かしたい位置のx座標とy座標を引数として与えます。
この時、マイナスや大きな値を与えると、画面外にマウスを動かすことができます。
bexecの非bcursor時の動作検証 - 永字八法のカーソルキーの挙動も、内部的にはこれを使っていると思われます。
それはともかく、実際のゲーム的にはイタズラくらいにしか使い途を思いつきませんが。

検証用スクリプト

*define
deletemenu
game
*start

mov %0,320
mov %1,240

rnd2 %2,-5,5
rnd2 %3,-5,5

終了する時はESCを押してください。

*loop

movemousecursor %0-80,%1-60

add %0,%2
if %0<0 mov %0,0-%0:mov %2,0-%2
if %0>799 mov %0,1600-%0:mov %2,0-%2

add %1,%3
if %1<0 mov %1,0-%1:mov %3,0-%3
if %1>599 mov %1,1200-%1:mov %3,0-%3

bclear
btime 10
bexec $100
if $100="ESC" end
goto *loop

bexecの非bcursor時の動作検証

bexecで待機中、bcursorを実行していない場合、カーソルキーによりボタンスプライト間をマウスカーソルが移動するのは仕様です。
この時、移動する先は、選ばれたスプライト(ボタン領域)の中心点になります。
では、仮に、スプライトの中心が画面の外になるような位置にセットし、それをボタン化、カーソルキーで操作してみたらどうなるか。
結論としては、マウスカーソルはその位置に移動しますが、nscr.exeの作るウィンドウから外れてしまいますので、それ以上は何も起こらないことになります。

検証用スクリプト

*define
deletemenu
game
*start

lsp 100,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,0
lsp 101,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,100
lsp 102,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,200
lsp 103,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,300
lsp 104,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,400

bclear
bsp 100
bsp 101
bsp 102
bsp 103
bsp 104
bexec $0,%0
mesbox $0,"押されたもの"
end

カーソルを動かしてみてください。

2011年04月05日のツイート

movemousecursorの挙動

マウスカーソルの位置を指定した場所に動かすmovemousecursor命令には、動かしたい位置のx座標とy座標を引数として与えます。
この時、マイナスや大きな値を与えると、画面外にマウスを動かすことができます。
bexecの非bcursor時の動作検証 - 永字八法のカーソルキーの挙動も、内部的にはこれを使っていると思われます。
それはともかく、実際のゲーム的にはイタズラくらいにしか使い途を思いつきませんが。

検証用スクリプト

*define
deletemenu
game
*start

mov %0,320
mov %1,240

rnd2 %2,-5,5
rnd2 %3,-5,5

終了する時はESCを押してください。

*loop

movemousecursor %0-80,%1-60

add %0,%2
if %0<0 mov %0,0-%0:mov %2,0-%2
if %0>799 mov %0,1600-%0:mov %2,0-%2

add %1,%3
if %1<0 mov %1,0-%1:mov %3,0-%3
if %1>599 mov %1,1200-%1:mov %3,0-%3

bclear
btime 10
bexec $100
if $100="ESC" end
goto *loop

bexecの非bcursor時の動作検証

bexecで待機中、bcursorを実行していない場合、カーソルキーによりボタンスプライト間をマウスカーソルが移動するのは仕様です。
この時、移動する先は、選ばれたスプライト(ボタン領域)の中心点になります。
では、仮に、スプライトの中心が画面の外になるような位置にセットし、それをボタン化、カーソルキーで操作してみたらどうなるか。
結論としては、マウスカーソルはその位置に移動しますが、nscr.exeの作るウィンドウから外れてしまいますので、それ以上は何も起こらないことになります。

検証用スクリプト

*define
deletemenu
game
*start

lsp 100,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,0
lsp 101,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,100
lsp 102,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,200
lsp 103,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,300
lsp 104,":c/3,0,3;>300,100,#FFFFFF#888888#111111",620,400

bclear
bsp 100
bsp 101
bsp 102
bsp 103
bsp 104
bexec $0,%0
mesbox $0,"押されたもの"
end

カーソルを動かしてみてください。

2011年04月05日のツイート

bsp対(a)msp

bspでスプライトをボタン化した後、そのスプライトを動かしたらどうなるか。

結論を先に。

ボタン領域も自動的にスプライトについてくるよ!

検証スクリプト

*define
deletemenu
game
*start

lsp 0,":c/3,0,3;>300,100,#FFFFFF#888888#111111",0,0
print 1
*loop
bclear
bsp 0
msp 0,1,1
print 1
btime 100
bexec $0
if $0="S0" end
goto *loop

2011年04月06日のツイート

2011年04月06日のツイート

bsp対(a)msp

bspでスプライトをボタン化した後、そのスプライトを動かしたらどうなるか。

結論を先に。

ボタン領域も自動的にスプライトについてくるよ!

検証スクリプト

*define
deletemenu
game
*start

lsp 0,":c/3,0,3;>300,100,#FFFFFF#888888#111111",0,0
print 1
*loop
bclear
bsp 0
msp 0,1,1
print 1
btime 100
bexec $0
if $0="S0" end
goto *loop

2011年04月06日のツイート

bsp対(a)msp

bspでスプライトをボタン化した後、そのスプライトを動かしたらどうなるか。

結論を先に。

ボタン領域も自動的にスプライトについてくるよ!

検証スクリプト

*define
deletemenu
game
*start

lsp 0,":c/3,0,3;>300,100,#FFFFFF#888888#111111",0,0
print 1
*loop
bclear
bsp 0
msp 0,1,1
print 1
btime 100
bexec $0
if $0="S0" end
goto *loop

2011年04月07日のツイート

2011年04月07日のツイート

2011年04月07日のツイート

2011年04月08日のツイート

2011年04月08日のツイート

2011年04月08日のツイート

2011年04月09日のツイート

2011年04月09日のツイート

2011年04月09日のツイート

2011年04月10日のツイート

2011年04月10日のツイート

2011年04月10日のツイート

2011年04月11日のツイート

2011年04月11日のツイート

2011年04月11日のツイート

2011年04月12日のツイート

2011年04月12日のツイート

2011年04月12日のツイート

2011年04月13日のツイート

return_plus命令を考案自作してみた。

returnが色々戻れるようになったのでその機能を使ってdouble_returnを実装したのを見て、もっと汎用的にreturn_plus命令を考えてみた。

命令

return_plus
引数に1以上の数値を指定し、その数値と同じだけgosubのスタックを抜ける。return_plus 1 は 通常のreturnと同じ効果を発揮する。
return_plus2
return_plusに加え、第二引数にラベルを指定し、スタックを抜けた後、そのラベルに飛ぶ。

どちらも数値が1未満であれば、何もせずに処理を返しreturn_plusの次の行へ進むので、注意が必要。

Aパート

define節game以上

numalias return_count,xxx ; xxxに他と被らない数値を指定
defsub return_plus
defsub return_plus2

Bパート

game以下start節以上

*return_plus
	mov $return_count,""
	getparam %return_count
goto *return_plus_common

*return_plus2
	getparam %return_count,$return_count
goto *return_plus_common

*return_plus_common
	if %return_count<1 return ; 指定数値が1未満なら、何もしない。
return *return_plus_main ; これで呼び出したルーチンと同じスタック深さになる。

*return_plus_main ; これがメインルーチン
	if %return_count>1 dec %return_count:return *return_plus_main ; %return_countが1になるまでreturnし続ける。
	if $return_count="" return ; 指定ラベルがなければ、普通にreturnする。
return $return_count ; そうでなければ、指定ラベルにreturn

return_plus命令を考案自作してみた。

returnが色々戻れるようになったのでその機能を使ってdouble_returnを実装したのを見て、もっと汎用的にreturn_plus命令を考えてみた。

命令

return_plus
引数に1以上の数値を指定し、その数値と同じだけgosubのスタックを抜ける。return_plus 1 は 通常のreturnと同じ効果を発揮する。
return_plus2
return_plusに加え、第二引数にラベルを指定し、スタックを抜けた後、そのラベルに飛ぶ。

どちらも数値が1未満であれば、何もせずに処理を返しreturn_plusの次の行へ進むので、注意が必要。

Aパート

define節game以上

numalias return_count,xxx ; xxxに他と被らない数値を指定
defsub return_plus
defsub return_plus2

Bパート

game以下start節以上

*return_plus
	mov $return_count,""
	getparam %return_count
goto *return_plus_common

*return_plus2
	getparam %return_count,$return_count
goto *return_plus_common

*return_plus_common
	if %return_count<1 return ; 指定数値が1未満なら、何もしない。
return *return_plus_main ; これで呼び出したルーチンと同じスタック深さになる。

*return_plus_main ; これがメインルーチン
	if %return_count>1 dec %return_count:return *return_plus_main ; %return_countが1になるまでreturnし続ける。
	if $return_count="" return ; 指定ラベルがなければ、普通にreturnする。
return $return_count ; そうでなければ、指定ラベルにreturn

2011年04月13日のツイート

return_plus命令を考案自作してみた。

returnが色々戻れるようになったのでその機能を使ってdouble_returnを実装したのを見て、もっと汎用的にreturn_plus命令を考えてみた。

命令

return_plus
引数に1以上の数値を指定し、その数値と同じだけgosubのスタックを抜ける。return_plus 1 は 通常のreturnと同じ効果を発揮する。
return_plus2
return_plusに加え、第二引数にラベルを指定し、スタックを抜けた後、そのラベルに飛ぶ。

どちらも数値が1未満であれば、何もせずに処理を返しreturn_plusの次の行へ進むので、注意が必要。

Aパート

define節game以上

numalias return_count,xxx ; xxxに他と被らない数値を指定
defsub return_plus
defsub return_plus2

Bパート

game以下start節以上

*return_plus
	mov $return_count,""
	getparam %return_count
goto *return_plus_common

*return_plus2
	getparam %return_count,$return_count
goto *return_plus_common

*return_plus_common
	if %return_count<1 return ; 指定数値が1未満なら、何もしない。
return *return_plus_main ; これで呼び出したルーチンと同じスタック深さになる。

*return_plus_main ; これがメインルーチン
	if %return_count>1 dec %return_count:return *return_plus_main ; %return_countが1になるまでreturnし続ける。
	if $return_count="" return ; 指定ラベルがなければ、普通にreturnする。
return $return_count ; そうでなければ、指定ラベルにreturn

2011年04月13日のツイート