btndownとisdown
 btndown命令とisdown命令、今まであまり使ったことがなかったんですが(未完成のマウスジェスチャースクリプトでちょこっと使ったくらい)、次に作りたい作品に必要そうだったんで、使い方とかちょっと調べてみました。

 まずNScripter本体付属のマニュアルを新・旧ともに見てみたのですが、両命令とも発見できず。
 こういうときはsenzogawaさんのNScripter API Reference (Unofficially)だ!
 ということで以下に両命令の説明を抜粋。

btndown
「btndefとbtnwait系命令の間に挟んでください。
そのボタン命令において、ボタンの押しっぱなしを取得できるようにします。」
isdown
「ボタン押下中かどうかを判定して結果を変数に格納する。
離していれば0、押していれば1が返る。」 

 つまり、isdown命令で結果を取得したい場合はbtndown命令を忘れるな、と。ここらへんgettab命令などのキー拡張命令と似てますな。

 ちょっと長くなるので続きは下のリンクをクリックしてください。
 




 で、「isdown命令でボタンの押しっぱなしを取得できる」となっていますが、これをもっと厳密にしてみたいと思います。
 以下の二つの検証スクリプトはどちらも、NScripter API Reference (Unofficially)掲載のisdownサンプルスクリプトを改良して使わせていただいてます。

*define
game

*start
lsp 1,":s#FFFFFFテスト",0,0
lsp 2,":s#FFFFFF動きますよー",200,0
print 1

*waitloop
wait 10
btndef clear
spbtn 1,1
btndown 1
btnwait %0
if %0=1 goto *onlclick
if %0=-1 end
goto *waitloop

*onlclick
isdown %1
if %1=1 msp 2,1,0,0:print 1:wait 10:goto *onlclick
goto *waitloop

 これは自分がさっきサクッと書いたやつです。"テスト"という文字列スプライトを左クリックしている間中、"動きますよー"という文字列スプライトが右に動き続けます。右クリックすると終了します。そのまま動かすとスプライトの移動速度が速かったり、CPU使用率を食いまくったりするので、waitを挟んであります。
 ちゃんと意図した通りに動いてくれましたね。



 さて、ここでもう一つ検証用スクリプトを。

*define
game

*start
btndef clear
getzxc
btndown 1
*waitloop
textclear
btnwait %0
if %0=-51 goto *onlclick
if %0=0 goto *onlclick
end
*onlclick
isdown %1
if %1=1 puttext "0/":goto *onlclick
puttext ""
goto *waitloop

 左クリックとZが押されている間中"0"を出してくれればいいなーという意図のもとで書いたのですが、これは左クリックの場合しか思った通りに動いてくれません。



 説明に「ボタンの押しっぱなしを取得」と書いてあるため、btnwaitで取得できるものならなんでもいけそうなイメージがあったのですが、実際は「spbtnなどで登録されたもの+左クリックの押しっぱなしを取得」といったところのようです。むしろ内部的には画面全体にボタン番号0番のボタンが広がっていて、spbtnなどでその上にボタンを乗っけるといった感じになっているのかもしれません。
 NScripterは左クリック以外のキーの押しっぱなしにはシステム的に対応できないっぽいので、そういうのが必要な人は君影草工房さんのGetKeyプラグインを使うといいんじゃないでしょうか。
[PR]
by lyricist_m | 2007-05-29 23:23 | NScripter
<< システム層とゲーム層の分離 textgosubで指定したラ... >>