カテゴリ:NScripter( 117 )
checkkeyを試してみた。
 結果だけを述べると
・キーを同時に押した場合、ある程度の数は認識してくれる
・英字、または"CTRL"などの特殊キーは、大文字小文字のどちらで指定しても認識してくれる。

 以下、長くなるので畳みます。

More
[PR]
by lyricist_m | 2009-03-29 14:45 | NScripter
checkkey×マウスジェスチャーとかできないかと思ったら無理だった。
 Ver2.91で追加されたcheckkey命令。
 ふと思ったのですが、これを使えばマウス右ボタンによるマウスジェスチャーが実現できるのでは?
 まず、textgosub内で右クリックされたらジェスチャー用ルーチンに飛ばす。ジェスチャー判定を行ない、まったく移動してなかったら通常の右クリックとして処理、移動が検知されたらジェスチャーとして認定、対応するアクションを実行する。
 うん、何とかなりそうだ。最近は吉里吉里ばっかり弄ってたから、今度のNScripterネタはこれにしようかな。

[追記]
 チェック「キー」だから、取得できるのはキーだけだよな……ということで、右クリック判定は出来ませんでした。
 右クリックも取得できるように要望を出してみようかしら。
[PR]
by lyricist_m | 2009-03-25 22:57 | NScripter
BGM再生に失敗したら落ちた
 ver.2.90を使っていて、間違ったファイル名でbgm命令を実行したところ、エラーメッセージもなく強制的に終了してしまいました。
 以前は何もせずにスルーするだけだったような気がするのですが……やっかいですね、これ。最初、何がいけないのか全然解りませんでしたから。bgm命令を上書きしてファイルの存在確認をするようにしようかな。
[PR]
by lyricist_m | 2009-03-04 23:33 | NScripter
特殊文字列構文
 新マニュアルを読み直してて、こんなものを発見。以下、新マニュアルから引用。

<新機能>
特殊文字列構文
(条件ファイル名)"TRUE文字列""FALSE文字列"
条件ファイル名がファイルログの中にあった(すでにロード済みだった)場合、TRUE文字列、
無かった場合、FALSE文字列を返します。
これは、たとえばCGモードのボタンを選ぶときに使えます。
少々みにくいですが、スクリプトを書くのが楽になります。C言語で言う?:に近いです。
例)
lsp 0,("cg1.bmp")"cg1_sum.bmp""dummy_sum.bmp",0,0


 こんなのあったんですね。全然知らなかった。
 ファイルログの中にあった場合、と書いてあるのでfilelog命令は必須みたいです。
 今度試してみよう。
[PR]
by lyricist_m | 2009-02-28 00:43 | NScripter
スキン戻しました
 見た目は良かったのですが、リンクの色とか固定幅とか、色々と使いづらくて……。
 暇があったらCSS弄って、個人的に使えると思えるようになったらまたあのスキンにしようと思います。
[PR]
by lyricist_m | 2009-02-27 17:20 | NScripter
スプライトの位置を取得する
[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について調べてみた
 movとsplitによって文字列を構造体のように扱ったりする場合に使うatoi命令ですが、ふと気になったのでその動作について調べてみました。以下スクリプト。

*define
defsub test
game

*test
getparam $0
atoi %0,$0
%0@
return

*start
;atoiは半角数字の文字列を数字に変換する
test "1"
;全角数字は変換できない
test "1"
;半角数字以外の文字が出てきた場合、その直前までを変換する
test "1,2"
;全く変換できない場合は0を返す
test ";"

end


 コメントにも書いてありますが、一応説明。
 atoi命令は「半角数字の文字列を数字に変換する」文字列です。変換対象は半角数字文字列のみであり、全角数字やその他の文字は変換できません。文字列中に変換できない文字があった場合、その直前の文字列までを変換します。もし文字列が全く変換できない場合は0を返します。

 atoi命令では全角数字を変換できませんが、自作命令で簡単に作れます。以下、全角数字変換命令atoi2のスクリプトです。

*define
defsub atoi2
game

*atoi2
getparam i%0,$0
mov $1,""
*atoi2_loop
mid $2,$0,0,2
if $2 < "0" goto *atoi2_end
if $2 > "9" goto *atoi2_end
if $2 == "0" add $1,"0"
if $2 == "1" add $1,"1"
if $2 == "2" add $1,"2"
if $2 == "3" add $1,"3"
if $2 == "4" add $1,"4"
if $2 == "5" add $1,"5"
if $2 == "6" add $1,"6"
if $2 == "7" add $1,"7"
if $2 == "8" add $1,"8"
if $2 == "9" add $1,"9"
len %1,$0
mid $0,$0,2,%1
goto *atoi2_loop

*atoi2_end
atoi %%0,$1
return

*start
atoi2 %10,"12"
%10@
end


 特に難しいことはしていません。もし挙げるとすれば文字列同士の大小比較とmidの使い方くらいでしょうか。動作に関してはatoi命令とほぼ同一で、違いがあるとすれば全角と半角に対する処理が反転している点です。もし全角も半角も関係なく変換したいのであれば、atoi2命令のif文羅列に半角数字に対する処理を追加し、終了判定を弄ればOKです。



 次回更新時は、スプライトの位置情報を取得できるようにlsp命令を上書きする話について書こうと思います。



[2009年2月26日追記]
 atoi2命令ですが、負の値を正しく変換できない不具合があることに気がつきました。ループに入る前に
mid $2,$0,0,2
if $2 == "-" add $1,"-"

 とすれば負も変換できるはず。
[PR]
by lyricist_m | 2009-02-24 21:08 | NScripter
文章の途中で色を変える
 あ
 なんてしたい場合。素直に
あ#FF0000い#00FF00う#0000FFえ#FFFFFFお
 と書けばいいようです。
[PR]
by lyricist_m | 2009-02-22 19:10 | NScripter
gosubで引数を受け取る(2)
 トイレに行ったら早速思いついたので、作ってみました。以下スクリプト。

*define
defsub a
game

*inc
getparam i%10
_inc %%10
return

*dec
getparam i%10
_dec %%10
return

*a
getparam $0
csvopen $0,"r"
*a_loop
csvread $1,%1
gosub "*" + $1 %%1
csveof %1
if %1 == 0 goto *a_loop
return

*start
a "test.txt"
%100、%101@
end


 test.txtの中身は
inc,100
dec,101
 になっています。
 これ、使えますね……。現在鋭意製作中のシナリオプレイヤーでは、フラグ操作をする際にファイルから文字列読んで、"inc"ならこれして"dec"ならこれして……とif文で分岐させまくっていたのですが、これならスリムに出来そうです。問題は引数を合わせる必要がある点ですが、gosub部分を一番引数の多い命令に合わせて作っておき、使わない引数には空文字入れておけば大丈夫そうです。
 いやぁ、何でもやってみるもんですね!
[PR]
by lyricist_m | 2009-02-20 03:34 | NScripter
gosubで引数を受け取る
 ひょんなことから、gosubでgetparamが使えることを発見してしまいました。長くなるので畳みます。

More
[PR]
by lyricist_m | 2009-02-20 02:57 | NScripter