カテゴリ:NScripter( 117 )
ループ実測
 for、goto、jumpb、skip、以上4種のループの実行時間を計測するスクリプトをDelusionist's UtopiaのNScripterにアップしました。
 詳しい内容はまた後ほど。

[7月8日追記]
 NScripterでは、主に4種類の手法で反復処理を行うことができます。それらの実行速度に違いはあるのか、実際に計測を行うことで確かめよう、というのが今回のスクリプトの趣旨です。
 計測対象のループは以下の4つになります。

・forループ
*loop_for
for %1 = 1 to max
next
return


・gotoループ
*loop_goto
mov %1,1
*loop
inc %1
if %1 <= max goto *loop
return


・jumpbループ
*loop_jumpb
mov %1,1
~
inc %1
if %1 <= max jumpb
return


・skipループ
*loop_skip
mov %1,1
inc %1
if %1 <= max skip -1
return


 純粋にループ処理にかかる時間を計測したいので、ループ中に特別な処理は挟んでいません。
 これらのループを一定回数(配布スクリプトでは100000回)繰り返し、ループに掛かった時間をgettimerで取得。さらに、ループ→実行時間取得を複数回(配布スクリプトでは10回)行ってその平均を取ることで、誤差をできるだけ少なくしています。
 以下、自分のPCでの計測結果など。

More
[PR]
by lyricist_m | 2008-07-07 18:04 | NScripter
「"(ダブルクォーテーション)」を文字変数に格納する方法
 「改行」を文字変数に格納する方法と同様の方法で、ダブルクォーテーションを文字変数に格納することができました。
 文字列を囲む時のダブルクォーテーションと混同されるんじゃないかと思ったのですが、意外と普通に扱えます。CSVで書き出すこともできますし、文字列との連結($0にダブルクォーテーションが入ってるとして、mov $0,$0 + "abc"とか)も可能です。

 いやー、readfile命令って結構使えますね。これでNScripterによるスクリプト自動生成が楽になります。今までは"の代わりに~を書いておいて、NScripterに生成させたあとでTeraPadを使って~→"に置換してました。たまに置換し忘れてNScripterに怒られたり。
[PR]
by lyricist_m | 2008-06-30 15:08 | NScripter
TeraPadからNScripterを起動する
 「TeraPadから直接NScripterを簡易実行させられる」とるしふぁさんから教えていただいたので、その方法を、書き残しておきます。

 1.バッチファイルを作成する
 TeraPadに直接NScripterをツールとして登録してもいいのですが、それだと1つのフォルダのスクリプトしか実行できないので、汎用性がありません。
 そこで、TeraPadとNScripterの間にバッチファイルを挟むことで、現在開いているスクリプトと同フォルダにあるnscr.exeを起動できるようになります。
 バッチファイルの内容ですが、自分は以下のようにしました。
@echo off
set NSCR_PATH="%~1\nscr.exe"
echo %NSCR_PATH%
%NSCR_PATH%

 \は半角円マークに脳内変換してください。
 バッチファイルの置き場所はTeraPadと同じ場所にしてます。他の場所にすると忘れてしまいそうで。

 2.バッチファイルをツールに登録する
 TeraPadのメニューからツール→ツールの設定と辿ってツールの設定ウィンドウを出したら、追加をクリックします。そして以下のように入力。
 名前:適当に。
 実行ファイル:バッチファイルをフルパスで指定。
 コマンドラインパラメータ:"%d"
 最低限これだけあればOKですが、あとキーも入れとくと一発で起動できて楽です。自分はAlt+Nにしてます。
[PR]
by lyricist_m | 2008-06-29 15:33 | NScripter
ボタン登録→画像削除→それでも定義は残ったまま
*define
game

*start
lsp 1,":s#FFFFFF■■■■■■■",0,0
spbtn 1,1
csp 1

*loop
btnwait2 %0
if %0 == 1 puttext "ひっと!@":textclear
goto *loop


 左上のあたりをクリックすると「ひっと!」と表示されます。
 ボタンの対象となる画像が削除されても、ボタン定義だけは残っているようですね。
[PR]
by lyricist_m | 2008-06-26 21:26 | NScripter
「改行」を文字変数に格納する方法
 改行コードを文字変数に格納する方法を思いついたので。
 まず、改行のみを記述したテキストファイルを用意します。右クリックで新規作成、テキストエディタで開いたら一回エンターを押して保存。名前はcrlf.txtとでもしておきましょう。これで準備はOKです。あとは作成したファイルをreadfileで読み込めば、文字変数に改行文字が代入されます。
readfile $0,"crlf.txt"
 こんな感じですね。
 で、これを使って、試しにスクリプトを書いてみました。

*define
game

*start
saveoff

readfile $10,"crlf.txt"
mid $10,$10,0,1
readfile $0,"00.txt"

mov $2,""
csvopen "test.txt","w"
*loop
mid $1,$0,0,1
if $1 == $10 csvwrite $2:len %0,$0:mid $0,$0,2,%0:mov $2,"":goto *loop
add $2,$1
len %0,$0
if %0 <= 0 mov %1,1:csvwrite $2:csvclose:end
mid $0,$0,1,%0
goto *loop


 00.txt(つまり実行中のスクリプトそのもの)を読み込み、そのまま出力するスクリプトです。テキストファイルから$1に1バイトずつ読み込んで改行文字の前半1バイトと比較、真ならCSVに出力して2バイト進め、偽なら$2に1バイト追加します。
 csvreadだと,(カンマ)でつまづきますが、readfileだと普通に読み込めます。まぁ、単に出力するだけならreadfile+csvwriteで済むのですが。
 これで何か面白いこと、できないかなぁ。


[6月27日追記]
 上記スクリプトのsplit版を作ってみました。
*define
game

*start
saveoff

readfile $10,"crlf.txt"
mid $10,$10,0,1
readfile $0,"00.txt"

csvopen "test.txt","w"
*loop
split $0,$10,$1,$2
csvwrite $1
if $2 == "" csvclose:end
len %0,$0
len %1,$1
mid $0,$0,%1 + 1,%0
goto *loop

 さすがにこっちの方がすっきりしてますね。
[PR]
by lyricist_m | 2008-06-24 14:44 | NScripter
グローバル変数とsaveoff
 saveoffしたあとでも、グローバル変数を弄ったら保存されます。
 saveoff=セーブ関連の動作を全くしない、というわけではないので注意。
[PR]
by lyricist_m | 2008-06-11 21:32 | NScripter
ドラッグで画像をぐりぐり
*define
numalias x,10
numalias y,11
numalias dX,12
numalias dY,13
numalias nowX,14
numalias nowY,15
game

*start
saveoff
print 1
mov %x,0
mov %y,0

*init
lsp 1,":s#FFFFFFあいうえお",%x,%y
itoa $x,%x
itoa $y,%y
caption $x + "," + $y
btndef clear
spbtn 1,1
btndown 1

*loop
btnwait %0
if %0 == 1 getmousepos %0,%1:mov %dx,%x - %0:mov %dy,%y - %1:goto *move
goto *loop

*move
wait 3
isdown %0
if %0 == 0 mov %x,%nowX:mov %y,%nowY:goto *init
getmousepos %0,%1
amsp 1,%0 + %dx,%1 + %dy
print 1
mov %nowX,%0 + %dx
mov %nowY,%1 + %dy
goto *move


「スプライトをどこに表示させよっかな……」って時に使えるスクリプト。
 lsp 1,":s#FFFFFFあいうえお",%x,%y
 の部分を変えれば任意の画像を動かせます。
 マウスでぐりぐり動かしてるだけで、けっこう楽しかったり。
[PR]
by lyricist_m | 2008-06-02 20:52 | NScripter
ver.2.83のbg/strsp命令テスト、及びRGB命令
 今回更新されたのはbg命令とstrsp/strsph命令の計3個の命令です。これらで色指定を渡す際に、今までのカラーコード形式に加えて文字列での指定ができるようになりました。
bg black,1
bg "black" ,1
bg #ff0000,1
bg "#ff0000",1

 上記は全部実行可能です。また文字変数での指定も可能になったので、ある程度動的に色を変更することが出来ます。まぁbg命令で動的に色を変更する場合が思いつかないので、使うのはおそらくstrspの方になるでしょうが。
 さて、ここで注意事項が1つ。本家サポートBBS情報ですが、ver2.83でstrspを使う場合、直接文字列で指定すると表示文と解釈されてしまうそうです。上記の4行のスクリプトで言うと偶数行にある形式ですね。これは今後改善されるそうなので、strspを使いたい人はしばし待ちましょう。
 また、今後のテスト版なんかを最終的にver.2.90として統合するそうなので、実際にゲームに使用するのはそこまで待った方が無難かもしれません。


 ところで、またBBSネタなのですが。RGB命令云々って話が出てたので、試しに作ってみました。
*define
defsub RGB
defsub RGB_convert
game

*RGB_convert
getparam s%10,%11
mov $11,""
for %12 = 1 to 2
mov %13,%11 mod 16
if %13 < 10 itoa $12,%13
if %13 = 10 mov $12,"A"
if %13 = 11 mov $12,"B"
if %13 = 12 mov $12,"C"
if %13 = 13 mov $12,"D"
if %13 = 14 mov $12,"E"
if %13 = 15 mov $12,"F"
mov $11,$12 + $11
div %11,16
next
add $%10,$11
return

*RGB
getparam s%0,%1,%2,%3
mov $5,""
for %4 = 1 to 3
if %%4 <= 0 add $5,"00":jumpf
if %%4 >= 255 add $5,"FF":jumpf
RGB_convert $5,%%4
~
next
mov $%0,"#" + $5
return

*start
RGB $100,10,30,50
caption $100
bg $100,1
click
end

 前にsetwindowのラッパーを書いてたときに似たようなことしてたから流用すればすぐかーと思ってスクリプトを覗いてみたらやってたのは逆の処理で、結局最初から書き直しました。RGB_convert命令をdec2hex命令として10進数→16進数全般を扱えるようにしようかと思いましたが、スクリプトが冗長になってしまったので2桁決めうちでやっときました。



 今後の予定。
・マウスジェスチャーの記事を書いて、サンプルスクリプトとしてDelusionist's Utopiaの方に置く
・ループの処理時間を計測
・saveoffをすると処理時間にどの程度差が出るのか計測
[PR]
by lyricist_m | 2008-05-18 12:40 | NScripter
NScripter ver.2.83 & Oggテスト版
 久しぶりにNScripterが更新されました。
 公式版ではbgやstrspなどの色指定を文字列で与えられるようになり、またOggテスト版では非同期フェードイン/フェードアウトが可能になりました。
 これから色々と試してみようと思います。
[PR]
by lyricist_m | 2008-05-17 09:27 | NScripter
forで無限ループ
 どこで見たのか忘れてしまいましたが(たしかブログだったような気がするんですが……)、思わず感動したので書いときます。
 forで無限ループを実現するには、stepに0を指定すればいいそうです。
for %0 = 0 to 0 step 0
 といった感じで。
 試しに1万回ほどループさせてみましたが、ちゃんと無限ループになってるっぽいです。
 ラベルを使わないのでそこはいいかも。
[PR]
by lyricist_m | 2008-05-14 23:09 | NScripter