スプライトに関する仕様確認

刃牙烈海王なら「怠ってました」と言うだろう、基礎中の基礎であるところのスプライトの仕様について、色々と。

allsphide
すべてのスプライトを一時隠す
allspresume
allsphideで隠したスプライトを表示する
amsp
スプライトの表示位置を変える(その2)
cell
直接スプライトのセルを指定する
csp
スプライトをメモリ上から消す
getspmode
スプライトの表示状態を確認する
getspsize
スプライトのサイズを取得する
lsp
スプライトを表示可能な状態でメモリ上に呼び出す
lsph
スプライトを表示不可の状態でメモリ上に呼び出す
msp
スプライトの表示位置を変える(その1)
spfont
文字列スプライトのフォントを設定する
spstr
複合ボタンの文字列でのスプライト指定で表示・非表示を切り替える
strsp
複数行文字列のスプライトをメモリ上に呼び出す
strsph
複数行文字列のスプライトを非表示状態でメモリ上に呼び出す
vsp
スプライトの表示・非表示を切り替える

スプライト関係はこれだけの命令が存在する。これらについて、調べてみた。

allsphide/allspresume

  • どちらの命令もその後printを実行しなければ画面には反映されない。
  • allsphide中に、スプライトを操作しても、それは画面には反映されない。
lsp 0,":c;>100,100,#FFFFFF",100,100
print 1:click

allsphide
print 1:click

amsp 0,200,200
print 1:click

allspresume
print 1:click

msp/amsp

スプライトを動かす命令。

  • どちらの命令でも、存在しないスプライト番号を指定するとエラーを出してこける。

どの要素もマイナスや非常に大きな数値を指定できる。x, yなら画面外に出るだけだが、alphaはどうなるか。

system.lua
-- system.lua

NSExec("luasub getspalpha")
function NSCOM_getspalpha()
	local spnum = NSPopInt()
	NSPopComma()
	local ret = NSPopIntRef()
	local x, y, alpha = NSSpGetPos(spnum)
	NSSetIntValue(ret, alpha)
end
00.txt
lsp 0,":c;>100,100,#FFFFFF",100,100
print 1:click

amsp 0,200,200,500
print 1
getspalpha 0,%0
%0\

amsp 0,200,200,-500
print 1
getspalpha 0,%0
%0\

結果、alphaに関しては、0未満は全て0、256以上は全て255に設定されることがわかった。
設定した数値を覚える機構を追加するなら、設定した数値か、その結果の数値か、どっちを記録するかについて考えなければならないだろう。

cell

スプライトのセル番号を指定する。
スプライトのアニメーション指定については、ここが詳しい。
初級編 No.7 アニメーション
※スプライトのセル指定で、セル数を0とかマイナスにするとフリーズする。
※ループ形式の指定で0〜3を超える数値を指定すると、どうやら1に固定されるようだ。

  • セル番号は、0から数える。3セルあるなら、有効なのは0〜2
  • セル番号を範囲を超えて指定しても何も起こらない。自動的に最大値まで減らされる。
  • セル番号に負数を指定した場合、バージョンによって動作が異なる。
    • 2.95ならば、フリーズして終了する。
    • 2.96以上ならば、時間はかかるようだが、スルーされるようだ。※若干描画が崩れるかも知れない。セイフティを追加した方がいいかも。
  • しかし、表示されるべきセルを指定できても、現在表示されているセル番号を取得する方法はない。
  • ループ形式で3以外を指定している場合、cell命令によって指定を変えたとしてもアニメーションは無効にならず、一定時間後には再開される。これによって現在の値を取得するのが困難になっている。
    • 仮に取得機能をつける場合は、ループ形式を指定したスプライトからは取れないような仕様になるだろう。
  • なお、cell命令は存在しないスプライトを指定してもエラーにならない。なんでだ。

csp

スプライトを消す命令。

  • 引数に-1を指定した場合、全てのスプライトが削除される。初心者は使いたがるが、すぐに後始末が大変なことに気付いて使わなくなる。
  • 一般的に複数の数値を引数にとって、その間のスプライトを全部消す命令が自作される傾向がある。
  • ちなみに、存在しないスプライト番号を指定しても何も問題は起きない。

getspmode/vsp

vspはスプライトの表示・非表示を切り替える命令。getspmodeはスプライト番号を指定して、そのスプライトが現在表示か非表示かを取得する命令。

  • どちらの命令も、存在しないスプライト番号を指定してもエラーにはならない。
  • gespmodeの場合、lsp後cspしたスプライト番号を指定すると、その時の情報が残っていて、それを返してしまう。getspsizeでスプライトの存在確認 : 幻惑郷と同種の問題と考えられる。
  • 上書きしてしまうのがいいかも知れない。

getspsize

スプライトの大きさと最大セル数を返す。

spstr

複合ボタンの書式を使って、スプライトを操作できる命令。
この書式を使えば、一度に複数のスプライトを一行で操作できるし、音声もつけられる。

書式 効果
"C0" vsp 0,0に等しい。
"P0" vsp 0,1に等しい。
"P0,1" vsp 0,1:cell 0,1に等しい。
"M0,10,20" amsp 0,10,20に等しい。※透明度の変更はできない。
"S2,(file.ogg)" dwave 2,"file.ogg"に等しい。
  • 単独命令なので、後でprintを実行しないと反映はされない。
  • ただし、Sだけは、その場で反映されてprintを待たない。

レイヤー型プラグインとの組み合わせの場合

*define
setlayer 10,25,"layer.dll"
game
*start
lsp 0,"*10"
end

通常のスプライトの振りをするレイヤー型プラグインを使った場合、各命令はどう動くか。

特に問題なく効果を発揮する。
  • allsphide
  • allspresume
  • vsp
  • getspmode
  • csp
何も起こらない。
  • amsp
  • msp
  • cell
数値の反応が変わる。
getspsize
返り値が1,1,1になる。
変わる

spstrは大きく変わる。

書式 効果
"C0" うまく働かない。レイヤーの動きは止まるが消えないかも。
"P0" 普通に動く。
"P0,1" 普通に動く。セル番号の指定は無視される。
"M0,10,20" 無視される。
"S2,(file.ogg)" 普通に動く。