スプライトに関する仕様確認
刃牙の烈海王なら「怠ってました」と言うだろう、基礎中の基礎であるところのスプライトの仕様について、色々と。
- 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
スプライトの大きさと最大セル数を返す。
- 問題はあって、ここに詳しい。getspsizeでスプライトの存在確認 : 幻惑郷
- それ以外、最初から存在しないスプライトでも指定可能。その場合、大きさは0*0、セル数は1が返ってくる。
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)" | 普通に動く。 |