スプライトの位置を取得する
[2009年5月11日更新]

 NScipterにはスプライトの位置を取得する命令がデフォルトでは存在しません。なので、いくつか命令を上書きして作ってみました。スクリプトはDelusionist's UtopiaのNScripterから落とせます。以下、スクリプトを落としたものとして話を続けます。

 このスクリプトではlsp、lsph、msp、amsp、cspの5命令を上書きしています。上書きした5命令は通常の使い方とほぼ変わらないものの、全命令で不透過度が扱えない点が異なっています。が、不透過度を操作したいのであればそれ専用の自作命令を追加すれば事足りるので気にしないことにします。
 それに加え、getspposの1命令を追加しています。これがスプライトの位置を取得する命令です。使い方はgetspsize命令と同じなので説明は割愛します。存在しないスプライトの番号を渡されると(0,0)を返します。

 実装の話に移ります。やってることは難しくありません。というか力技です。
 位置情報を格納するのに使用している変数は100個の文字変数です。1つの変数にスプライト10個分の情報が入っていて、100×10でスプライト1000個分。これをバラしたり結合させることで情報の格納・取得を行なっています。
 まず情報の格納について。スプライトを読み込む際に、スプライト番号から格納すべき変数番号を算出。次に、該当する文字変数を一旦バラし、スプライト10個分の情報を取り出します。しかるべき場所に情報をセット、そして再度情報を結合させて変数へ格納。
 取り出す場合も、変数番号の算出・情報の分解までは一緒です。ただ結合させないだけ。
 問題は、使用する変数番号が多いことです。情報の格納に100個、取り出す際にsplitで使用する変数が10個、一時変数なども含めると大体120個弱になります。これはちょっと多いですね。情報の格納については、理論上は25×40で65個あれば十分なのですが、やめておきました。なぜかというと、スプライトを読み込むたびに
mov $0,$1,...,$25
 とか、
split $0,";",$1,...,$25
 をしていたら、さすがに重くなるかなと思いまして。ただ、使用する文字変数が増加するということはセーブデータ1個あたりの容量が増加することに等しいので、速度を取るか容量を取るか、悩ましいところです。速度に関しては、試しに実測してみようかな。

 あと、スプライト位置取得命令の使用例として、マウスカーソルをスプライトの指定の位置に表示させるmouse_moveToSprite命令を作りました。第一引数にスプライト番号、第二引数に場所定数を取ります。場所定数は「スプライトのどの場所にカーソルを移動させるか」を表したもので、1から5まであり、それぞれ
1:左上
2:右上
3:右下
4:左下
5:中央
 となっています。番号と場所の対応は適当に決めたものです。



 自作命令でもスプライトの位置を取得することはできました。が、本音を言うとデフォルトで位置取得命令をつけて欲しいです。未だにつけられていないところを見ると、絶望的な気もしますが。



[追記]
 NSLuaでスプライトの位置を取得するNSSpGetPos命令が実装されました。
 今後はこちらを利用しましょう。
[PR]
by lyricist_m | 2009-02-27 06:54 | NScripter
<< スキン戻しました atoiについて調べてみた >>