<   2007年 07月 ( 6 )   > この月の画像一覧
自分のHPに飛ばすには――shell
 「NScripterから自分のサイトにジャンプできるようにしたいのですが、どうしたらいいですか?」という質問はたまに見かけるものですが、ググってみたところ検索上位にはヒットしないし、講座サイトやTipsサイトで書いているところも自分が知っている限りではないようなので、ちょっと書いておきます。半分は自分のためなんですけどね。よく忘れるので。

 NScripterから既定のブラウザを起動させ特定のWEBサイトに飛ばすには、shell命令を使います。例えばGoogleにジャンプさせるには
 shell "http://www.google.co.jp/"
 と書けばOKです。他のURLに飛ばしたいなら、shell命令に渡す文字列を書き換えればいいわけです。
 この時に開くブラウザは既定のブラウザなので、ユーザーのPCの設定によって開くブラウザは変わってきます。大抵の人はIE(インターネットエクスプローラー)が開くのではないでしょうか。
[PR]
by lyricist_m | 2007-07-29 04:33 | NScripter
コーディング規約(2)――ラベル
 ちょっと時間を置いて第二回目。今回はラベルの書き方について、です。
 一口にラベルと言っても、実は種類があるわけで。
 まず思いつくのは「ラベルを使用する命令による分類」でしょうか。これで分類してみましょう。
 ラベルを使用する命令は以下の通りです。

・csel
・defsub
・gosub
・goto
・loadgosub
・lr_trap,lr_trap2
・pretextgosub
・r_trap
・return
・rgosub
・select
・selgosub
・tablegoto
・textgosub
・trap,trap2

 NScripter API Reference (Unofficially)からアルファベット順に抜き出してみました。
 returnも入っているのは、戻る先にラベルを指定できるからです(return *startみたいに)。
 で、各命令ごとに異なるラベル名を考えてもいいのですが、それはあまりにも無駄が多すぎるので、もうちょい絞りましょう。
 これらの命令は、大きく分けて二つに分類できます。一つはgotoのように、指定されたラベルに飛ぶだけの一方通行の命令と、もう一つはgosubのような、指定されたラベルに飛んだ後、returnで呼び出された行に戻る往復型の命令です。ラベルとreturnとの対応を確認するためにも、往復型のラベルにはなにか目印をつけておくといいかもしれませんね(プレフィクスとしてrをつけておくとか)。また、往復型のラベルでも、自作命令(defsub)のラベルとサブルーチン(gosub)のラベルは分けておいたほうが解りやすいかもしれません。他にはシナリオ用のラベルとシステム用のラベルをわけるとか。
 ちなみに自分は、現時点では特に書き分けていません。ライブラリ化・モジュール化を進めたら、基本的にgoto/gosubで飛ぶのは1つのファイル内のみなので(さすがにシナリオはファイルを跨ぎますが)、そこまで困ることがないんですよね。
 前にも紹介した、「間違ったコードは間違って見えるようにする」っていう記事の考え方に基づくなら、goto系の命令とgosub系の命令を間違えないように区分すべきだなと考えているので、そのうちプレフィクスをつけるかもしれません。
[PR]
by lyricist_m | 2007-07-19 20:31 | NScripter
コーディング規約(1)――定数と変数
 コミケに向けてそこそこ忙しくなるため、スクリプトを書いてアップするような記事を書くのは少し難しいかもしれません。一応一時変数ライブラリは完成したんですが、readmeを書くのが遅れてます。そのうち「とりあえずスクリプトを見てくれ」って感じで投げやりにアップするかもしれませんが。
 ともかく、時間のかかる話は厳しいものの、なるべく更新は途絶えさせたくないので、文章だけでいけるネタはないものかと思案しておりました。そこで、自分がNScripterでスクリプトを書くときに守っているルールについて書くことにしました。ちなみに常に守っているわけではなく、検証用スクリプトや手軽に書きたい時は基本的に無視して適当に書いてたりします。
 あとこれはシリーズ化させるつもりです。回数は未定ですが、まぁそんなに長くはならないでしょう。

 ということで、第一回目は定数と変数の命名規則について。
 まず定数ですが、これは基本的に全部大文字にして、単語間をアンダーバーで繋いでいます。FONT_SIZE_Xみたいな感じですね。昔はプレフィクスとしてnやnum(数字)、sやstr(文字)をつけていましたが(nFONT_SIZE_XとかsFILE_NAMEとか)、最近ではつけていません。定数として文字を使うことが少ないから、大体の定数は数字になるため、あまり意味がないんですよね。
 次に変数。これはPacal記法を使ってます。TextLengthみたいな感じですね。プレフィクスは、グローバル変数にgをつけてgBgmVolumeって感じにしてます。数字変数と文字変数とわけてもいいんですが、わざわざ別につけるのが面倒なので、数字変数でも文字変数でも同じ名前を使いまわしています。一時変数とか中身を気にしないでいいですしね。分けるのもメリットがあるとは思いますが。あとサフィックスとは微妙に違うんですが、TempXとArgXをよく使います(Xにはどちらも数字が入ります)。

 第一回目はこんなところで。
 敢えて書くようなものでもないとは思うんですが、一度こうやってまとめておかないと製作中に気分で変わってしまったりするもので……1ヶ月前のスクリプト見ると書き方がかなり変わってたりとか。製作が長期に及ぶと起こる現象です。
[PR]
by lyricist_m | 2007-07-10 18:53 | NScripter
オプションの場所
 ずっと悩んでいることに「オプションはポジション的にどこらへんになるんだろうか」というものがあります。
 自分がNScripterでゲームを作る場合、基本的に1つのテキストファイルに1つの内容をまとめるんですよ。例えば、こっちのファイルにはtextgosubの処理を書いて、こっちには画像関係をまとめて、こっちには右クリックメニュー関連を……といった感じです。そしてこれらのファイルにはある程度の独立性を持たせるようにしてます。こっちのファイルを修正したからこっちのファイルも修正しないとダメだよね、っていうのを極力なくすためです。それに独立性を持たせれば他のゲームに使いまわすこともできますしね。
 で、問題になるのがオプションなんですよ。オプション画面で設定できる項目はテキスト処理に関してだったりBGM・SEに関してだったり、と多岐に渡ります。つまり、色々なファイルにちょっかいを出す感じになるんですよね。
 どうしたもんかなーと悩み続けて、最近はget/set系の自作命令をたくさん作ることで何とかしています。これだと独立性は保てるけど、色々と無駄な気がしないでもないです。処理速度遅くなりそうだし。
 一体どう書くのがベストなのか、他の人はどうやって書いてるのか。すごく気になります。
[PR]
by lyricist_m | 2007-07-07 19:16 | NScripter
monocro命令が効かない!
 黒い背景に画像をlsp2で拡大表示し、monocro命令で赤くしようと試みた。
 最小スクリプトでは成功するのに、ゲームに組み込むとなぜかmonocro命令が効かない。色が変わらずそのままになる。どうやら背景を変更するとmonocro命令が有効になるようだが、bg命令のパラメータにblackを与えたり、黒一色の画像を背景として読み込ませた場合は無効になる。
 NScripter自身の不調やenvdataの破損等も考えたが、そもそも別の場所で使っているmonocro命令は正常に動作しているのだ。スクリプトのある一点においてのみ動作しない、というのはどうも腑に落ちない。
 あー、もうわけわからん。debuglogでどうにかできる問題でもないし、どうしたもんか。

【追記】
 背景を変更すると有効になる、というのはどうやら勘違いだったようだ。スプライトのα値を通常の半分にしていたため、単に背景の赤さが透過していただけの模様。

 そして原因も判明した。どうやら犯人はwindowback命令のようだ。
 windowbackを使うと、いかなる拡張スプライト番号にしようが、monocro命令がスプライトに反映されることはなかった。humanzを使っても駄目。
 ちなみに通常のスプライト(lsp)の方は、windowbackを使ってもhumanz以降の値を指定すれば問題なかった。
 うーん、これはlsp2を使うなということなんだろうか。システムカスタマイズをしている以上、windowbackは必須だし。drawspあたりで代用してみるか。

【さらに追記】
 赤くしたい画像の前に、真っ赤なウィンドウサイズの画像を1枚lsp2でロードすることで解決しました。
[PR]
by lyricist_m | 2007-07-04 18:31 | NScripter
スタックの速度改善
 永字八法 - スタックまとめを読んでしまったので、取り急ぎ文章だけでも。以下の文章を読む時は永字八法 - スタックまとめを見ながら読むことをお勧めします。自分も見ながら書いたんで。

 まず1点目。
「この考え方はさらに推し進めると、push, popの際に、スタックに使う変数を指定する遣り方が考えられる。つまり、特別にスタック用領域をスタックで用意するのではなく、スタックを使う側に用意させる方法である。これならば、スタック領域も過不足なく用意できるだろう。」
 と「スタックのローカライズ」の項でむいむいさんがおっしゃっていますが、まっことそのとおりです。現在Tempライブラリを作成中ですが、ライブラリに組み込んだ内部命令のpush/popには変数番号を渡していますからね。
 正直、変数番号管理の方がやりやすいんでしょうが、スタック領域の破壊をなるべく防ぐことと、スクリプトに余り慣れていない人にもこっちの方が安心して使えるのではないだろうかということで、スタック番号で管理するようにしました。次回はスタック番号でも変数番号でも扱えるようにバージョンアップしましょう。

 で、2点目。こっちが本題。
 「しかしその実装方式(splitの性質をうまく利用して切り出すなどの見るべき点も多い)は、同時にスタックの大きさ(限界)に不確定性を持ち込んでしまった。それに、速度の点で疑問が残る。スタックの積み方からして、積めば積むほど実行速度が遅くなることがわかるからだ。スクリプトの簡便さとのトレードオフの問題なのだろうが。」
 またもやむいむいさんの記事からの抜粋ですが、確かに文字列変数を用いた簡易スタックの問題は、スタックサイズと実行速度の2点なんですよね。
 むいむいさんはこの問題を解決するために固定長スタック、つまり入れる要素の方に工夫を施すことで対処を行うことを提案なさっています。ところが、自分が考えていたのはちょうどこれと反対方向への対策でした。むいむいさんの方法を「箱に入れる物のサイズを統一することで問題を解決する考え方」だとしたら、自分の方法は「箱を増やすことで問題を解決する考え方」です。要は、1.にあるNScLisperの中の人ことzickさんのやり方と2.の自分のやり方を合わせたものです。

 では、どうやるのか。まず、ある一定数の文字変数をスタック用領域として確保しておき(定数で確保してもいいし、引数などで指定させてもいい)、また数字変数を「スタック用文字変数の変数番号へのカーソル」として確保しておきます。次に、スタック1つの最大サイズを指定しておきます。そしてpush命令内部で、スタックの最大サイズを超えたら、カーソルを次のスタックに移します。
 説明だけでは理解しにくいと思いますので、具体的にどんな処理をするのか、文字列スタックを例に書いていきましょう。
 まず、文字変数$0~$9までをスタック用領域として確保します。また、数字変数%0をスタックへのカーソルとして確保し、%0に文字変数$0の変数番号である0を代入しておきます。スタック1つの最大サイズはとりあえず10としておきましょう。
 そして、とりあえず適当にpushします。例えばabcdefghijkをpushしたとしましょう。スタックのカーソルは0、つまり$0になっているので、$0にpushした値が格納されます。pushされた値は11バイトなので、これでもうスタック1つの最大サイズを超えてしまいました。
 今までの自分のやり方なら、ここで「スタックオーバーフローが発生しました」とエラーメッセージを出して強制終了させていたところですが、新しいやり方では違います。スタックが最大サイズを超えた場合、スタックのカーソルを次のスタック(この場合$0の次なので$1)に自動的に移すんです。そして次回以降、操作対象のスタックは$1に移り、また$1が一杯になったら$2に……といった感じに処理をしていきます。$9まで一杯になったら、その時になって初めてエラーメッセージを出力します。
 こうすれば1つなぎのスタックとしてかなりの容量を確保できますし、またスタック1つの最大サイズを小さく設定すれば、処理速度の問題も(おそらく)軽減できるでしょう。

 まだ設計段階で、実装に入ったら色々と問題が出てきそうではありますが、Tempライブラリ実装後にスタックver4として、上記のやり方で製作してみたいと思います。
[PR]
by lyricist_m | 2007-07-02 23:47 | NScripter