<   2008年 05月 ( 13 )   > この月の画像一覧
戦利品
 書くのをすっかり忘れていたので。

Wish-tale of the sixteenth night of lunar month- (MIGIHA)
 うちのサークルの音楽担当(新人)が買ってたのを見て、自分も購入。いやぁ、ペーパーに「このゲームはNScripterで作ってます」とか書かれてたら、つい「買わなきゃ」って気持ちになって。まだインストールしただけで終わってます。早くプレイしたいです。でも時間が。

はじめての東方和楽  (白いしましまうさぎ)
 イベント帰り、徹夜明けでふらふらしながらもメロブで購入。これはもう前から買うって決めてました。作業用BGMにいい感じです。落ち着いて仕事ができそう。
[PR]
by lyricist_m | 2008-05-29 11:52 | 日常
コマンドプロンプトでカレントディレクトリ以下のファイルを一気に移動させる
 hugflashで変換したMP3ファイルを一度に移動させる際に使いました。
for /r /d %i in (*) do move "%i\ファイル名" "移動先ディレクトリ名"
 こんな感じです。
[PR]
by lyricist_m | 2008-05-23 14:25 | 日常
絶賛修羅場中...
 今度の日曜、25日にヤフードームで行われるコミックシティに参加するんですが、そこで無料配布するアイマスゲーの製作に追われています。色々と書きたい記事があるんですが、おそらくイベント終了までは時間が取れないと思います。まだシナリオも上げてないんで。なので、しばらくお待ちください。
[PR]
by lyricist_m | 2008-05-22 18:40 | 日常
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
引数ライブラリ修正
 NScripter-Tipsさんからうちのサイトにリンクが貼られていることに気がついた。
 takadaさん、ありがとうございます! 中級者用講座、参考になります。うちと違ってグラフィカルだし。



 さて本題。
 サイトの方にアップしてるセーブサンプルを、引数ライブラリを使って書き直そうとしたら、どうも上手く動かない。
 原因は、endParamでParamX系変数の状態を復帰させるさいに、スタックから値を取り出す順番を間違えていたようで……。ということで、引数ライブラリを修正してアップしなおしました。

 今回の教訓。
・デバッグログを出すタイミングはよく考えよう。下手すると数百kbのテキストファイルが出来てしまう
・csv系の命令は使える。自分にとっては、もはやデバッグ用の命令
・変数の中身を確認したい、でもcsvで書き出すほどでもない、という時はcaptionがオススメ
・命令の単体テストは丁寧に行うべき


 あと、デバッグ時だけ既存の命令を上書きしてデバッグ用の処理を追加、リリース時は既存の命令のまま使う、なんてのもありじゃないかと思いついた。
if DEBUG_MODE == 1 defsub csp
とか。
[PR]
by lyricist_m | 2008-05-12 22:09 | NScripter
マウスジェスチャー(3) btndownとisdown
 今までclickposによる座標の取得を行ってきましたが、マウスジェスチャーというのはドラッグされている間はずっと方向を取得し続けるものです。なので、そのように書き換えます。以下サンプルスクリプト。

;value2000
*define
mov %0,100
numalias x1,%0:inc %0
numalias y1,%0:inc %0
numalias x2,%0:inc %0
numalias y2,%0:inc %0
numalias dx,%0:inc %0
numalias dx_sign,%0:inc %0
numalias dy,%0:inc %0
numalias dy_sign,%0:inc %0
numalias temp,%0:inc %0

globalon
mov %0,2000
numalias sensitivity,%0:inc %0
mov %sensitivity,10

defsub abs_sgn
game

*start
btndef clear
btndown 1

*loop
caption ""
btnwait2 %0
if %0 = 0 getmousepos %x1,%y1:goto *gesture
goto *loop

*gesture
wait 5
isdown %temp
if %temp != 1 goto *start
getmousepos %x2,%y2

abs_sgn %x2 - %x1,%dx,%dx_sign
abs_sgn %y2 - %y1,%dy,%dy_sign

if %dx < %sensitivity && %dy < %sensitivity goto *gesture
if %dx >= %dy && %dx_sign > 0 caption "右"
if %dx >= %dy && %dx_sign < 0 caption "左"
if %dx <= %dy && %dy_sign > 0 caption "下"
if %dx <= %dy && %dy_sign < 0 caption "上"

mov %x1,%x2
mov %y1,%y2
goto *gesture

*abs_sgn
getparam %0,i%1,i%2
mov %3,1
if %0 < 0 mov %3,-1
mov %%1,%0 * %3
mov %%2,%3
return


 大きな変更点は「%sensitivityをグローバル変数にしたこと」と「clickposを廃止してgetmouseposで座標を取得するようにしたこと」です。これでかなりマウスジェスチャーっぽくなりましたね。
 次は、ジェスチャーとアクション(セーブとかロードとか)を対応させてみます。



 [2008年5月13日追記]
 書こうと思っていたのにすっかり忘れていました。
 btndownおよびisdownの使い方については、幻惑郷 : btndownとisdownに書いてあります。
[PR]
by lyricist_m | 2008-05-11 21:39 | NScripter
ブログ名を変更しました。
 今まで個人サイトに「のブログ」をつけるだけという深く考えずに決定したブログ名でやってきましたが、さすがに変えたほうがいいかと思い立ったので変更しました。ちなみに北原白秋の「邪宗門秘曲」を読んだのがきっかけです。
[PR]
by lyricist_m | 2008-05-11 18:11 | 日常
マウスジェスチャー(2) 感度の導入
 マウスジェスチャースクリプトを引数ライブラリと一時変数ライブラリを使って実装してみようとしたら、座標取得だけでかなり重くなってしまいました。内部的にスタック2つも使ったりしてたらそりゃ重くなるか……。
 実行速度のことを考えて、最終的には自作命令とかほとんど使わずに実装しますが、それだと読みづらいスクリプトになってしまうので、製作途中は自作命令ありで行こうと思います。

 で、今回は「感度の導入」です。まずはサンプルスクリプトから。

*define
mov %0,100
numalias x1,%0:inc %0
numalias y1,%0:inc %0
numalias x2,%0:inc %0
numalias y2,%0:inc %0
numalias dx,%0:inc %0
numalias dx_sign,%0:inc %0
numalias dy,%0:inc %0
numalias dy_sign,%0:inc %0
numalias sensitivity,%0:inc %0
numalias temp,%0:inc %0

defsub abs_sgn
game

*start
mov %sensitivity,10
clickpos %x1,%y1

*loop
clickpos %x2,%y2

abs_sgn %x2 - %x1,%dx,%dx_sign
abs_sgn %y2 - %y1,%dy,%dy_sign

if %dx < %sensitivity && %dy < %sensitivity caption "":goto *loop_end
if %dx >= %dy && %dx_sign > 0 caption "右"
if %dx >= %dy && %dx_sign < 0 caption "左"
if %dx <= %dy && %dy_sign > 0 caption "下"
if %dx <= %dy && %dy_sign < 0 caption "上"

*loop_end
mov %x1,%x2
mov %y1,%y2
goto *loop

*abs_sgn
getparam %0,i%1,i%2
mov %3,1
if %0 < 0 mov %3,-1
mov %%1,%0 * %3
mov %%2,%3
return


 さて、今回の変更点は
1.変数%sensitivityの導入
2.自作命令cmp_abs削除、代わりに自作命令abs_sgn追加
 の2点です。
 まずは1.の説明から。感度を意味する数字変数%sensitivityを導入しています。。このスクリプトではローカル変数で実装していますが、できればグローバル変数にしてオプション画面からマウスジェスチャーの感度を変更できるようにしたりするといい感じになると思います。
 次に2.の説明を。%sensitivityを使う際は「マウスの移動距離と比較し、%sensitivity以下なら処理をスキップする」というような感じになりますが、単純に
%dx < %sensitivity
 なんてしてしまうとアウトです。%dxは負の値も取りうるわけですから。だからといって
if -%dx < %sensitivity && %dx < %sensitivity && -%dy < %sensitivity && %dy < %sensitivity
 とかやるのはちと面倒です。
 ここで、少し考え方を変えます。前回のスクリプトで登場した以下のif文、
if %temp >= 0 && %dx > 0 caption "右"
 これの条件文の2つ目、 %dx > 0 で必要としているのは「正なのか負なのか」という情報だけですよね。そして感度の実装に必要なのは移動距離の絶対値ですし、上のif文の %temp >= 0 で比較しているのも実際は移動距離の絶対値の大きさなわけです。ならばもう、絶対値と符号を分けちゃいましょう。
 ということで登場するのが自作命令abs_sgnです。第一引数に受け取った数値の絶対値(abs)を第二引数に、符号(sgn)を第三引数に返します。絶対値を返す命令と符号を返す命令をそれぞれ作ってもいいのですが、スクリプトを短くするために統合しています。

 さて、これで方向の取得周りは大体できました。次からはbtndownとisdownを使って、動的な方向の取得に挑戦です。
[PR]
by lyricist_m | 2008-05-09 23:00 | NScripter