第1章 やさしい入門
まずは、NASCを手短に紹介することから始める。われわれの目的は、細かい点や、公式の規則(そんなものは無い)や、例外に深入りせず、実際のプログラミングによってNASCの本質的な要素を示すことである。ここでは、完全あるいは正確であることは二の次とする。
ここでは、読者はC言語の極めて基本的な事柄(変数の宣言や if文の文法、{ }や( )の使い方)を理解していることを前提として話を進めることとする。
1.1 手始めに
新しいプログラミング言語を学ぶ唯一の道は、それでプログラムを書いてみることである。最初に書くべきプログラムは、どんな言語でも同じで、例えば次のものである。
hello, world
という単語を印字せよ。
しかし、NASCは「何か」のイベント処理を目的とした言語なので、上記の例は不適切である。そもそもNASCには印字機能に相当するものは無い。
そこで、ここでは見切れ処理を例題として取り上げる。
見切れとは、sakura 側のキャラクタが、画面外にはみ出した状態のことである。
「何か」から梨野に対してこの情報は、OnSecondChange、OnMinuteChange の Reference1 で渡される。
NASCを使用せずに、梨野の辞書検索機能だけでこの情報を使用することは可能である。
nasino event OnMinuteChange reference1[1] : ¥0見切れだ。¥n¥w8¥1見切れやね。¥e
この辞書エントリは、OnMinuteChange イベントが発生した場合に Reference1 が 1 であった時に選択され、「何か」に¥0見切れだ。¥n¥w8¥1見切れやね。というトークを返す。
しかし、この方法では見切れ状態が続いている間、OnMinuteChange イベントが発生するたび(毎分)に同一のトークを発生することになる。
そこで、見切れ処理が発生した時に一度だけトークを発生する方法を考える。
int mikiref; if(strcmp(event,"OnSecondChange")==0){ if(atoi(reference1) == 1){ // 見切れ if(mikiref == 0){ strcpy(user_event,"UE.MikireStart"); // イベント:見切れ発生 mikiref = 1; } }else{ mikiref = 0; // 見切れ解消 } }
このスクリプトは、見切れ発生時に一度だけ UE.MikireStart というユーザーイベントを発生する。
このスクリプトを実行するには、nasino.dll のあるディレクトリに、script.nc というファイルを作成し、そのファイルにスクリプトを記述しておく。nasino.dll は、実行時に script.nc を自動的に読みこみ、以後イベント発生時に自動的に実行する。
次に梨野の辞書に
nasino event UE.MikireStart : ¥0見切れだ。¥n¥w8¥1見切れやね。¥e
という行を追加する。これは、UE.MikireStart というイベントが発生した時に呼び出されるトークである。
これで、「何か」を起動し、sakura 側のキャラクタをドラッグして画面外に出すと、即座に¥0見切れだ。¥n¥w8¥1見切れやね。というトークが発生する。このトークは一度だけ発生し、そのまま放置しても、二度と発生しない。
いったんキャラクタを画面内に戻して、再度画面外に出すと、再び見切れのトークを行う。
次に、このスクリプト自体について少し説明しよう。
NASCには、C言語で言うmain()関数は存在しない。プログラムはスクリプトの先頭から実行される。言わば、全てがmain()関数の中身であると考えてよい。従って、ユーザーが関数を定義することもできない。
一行目
ここでは、int型の変数 mikiref を定義している。宣言された変数には、0 が代入される。
int mikiref;
変数の定義はスクリプトの読みこみの時に一度だけ行われ、以後イベント発生でスクリプトが実行される時には無視される。宣言された変数の内容は保持され、次回イベント発生時に引き継ぐ。
三行目ここでは、OnSecondChange イベントの発生の検出を行っている。
if(strcmp(event,"OnSecondChange")==0){
strcmp() は二つの文字列の比較を行う組込関数で、動作は ANSI-C の strcmp() と同一である。event は、NASCの使用する文字列変数である。この中には、「何か」から渡されたイベント名が入っている。strcmp() は、二つの文字列が一致した場合に 0 を返す。この行では、event の内容が "OnSecondChange"と一致した場合、if文の条件判定が真となり、続く { } の中の処理が行われる。
四行目この行では、見切れが発生しているかどうかを判定している。reference1 は三行目のevent と同じく、NASCの使用する変数である。この中には、「何か」から渡されたイベントの reference1 が文字列として入っている。 reference0 から reference7 が同様に使用できる。
if(atoi(reference1) == 1){ // 見切れ
見切れ発生時には、このreference1 に 1 が入力される。これを判定するには、三行目と同様にstrcmp() を使用してもよいが、ここでは atoi() 関数を使用する。この関数は、返り値として、入力された文字列を数値として返す。
つまりこの行では、reference1 が 1 の場合は五行目〜八行目を実行し、それ以外の場合は、else 以下の十行目を実行するための条件分岐を行っている。
五行目五行目〜七行目は、見切れが発生しているときに実行される。
if(mikiref == 0){
五行目では、変数 mikiref の内容を調べ、六、七行目を実行するかを判定する。
最初にこの行が実行されるときは mikiref は宣言された時と同じ 0 であり、六、七行目を実行する。
しかし、一度七行目を実行して mikiref が 1 に書きかえられた後は、見切れが解消され、十行目で 0 に書きかえられるまで六、七行目は実行されない。
六行目この行では、見切れ発生のユーザーイベントの登録を行っている。
strcpy(user_event,"UE.MikireStart"); // イベント:見切れ発生
user_event は event と同様のNASCの使用する文字列変数である。この変数にユーザーイベント名を入れておくと、スクリプト完了時にそのユーザーイベントが梨野に対して発生する。ユーザーイベントにReferenceを渡したいときは、 user_reference0 から user_reference7 変数を使用する。これらは全て文字列変数であることに注意する。
strcpy() は文字列変数の内容をコピーする関数である。使用方法はANSI-C の strcpy() と同様である。 ここでは user_event に、UE.MikireStartという文字列をコピーしている。
七行目この行では、変数 mikiref に 1 を代入し、見切れイベント発生不可にする。
mikiref = 1;
この mikiref が 0 にならない限り、見切れ状態でも五行目の条件判定によって六行目は実行されす、見切れイベントは発生しない。
十行目この行は、見切れが発生していない場合に実行される。ここでは変数 mikiref に 0 を代入し、六行目の見切れイベント発生を可能にする。
mikiref = 0; // 見切れ解消
このプログラムのポイントは、変数 mikiref の動作である。
最初に見切れが発生すると、ユーザーイベント UE.MikireStart が発生する。しかし、そのまま見切れ状態が続き、次の OnSecondChange イベントが発生した時は、 mikiref の内容は前回の実行結果である 1 を保持しているため、 UE.MikireStart は発生しない。
見切れ状態が解消され、 mikiref が 0 になると、再び見切れによって UE.MikireStart を発生させることができるようになる。
梨野に標準添付されているスクリプトでは、見切れ発生後五秒( OnSecondChange イベント五回)待ってから UE.MikireStart を発生させるようになっている。そちらも合わせて参照してほしい。
[第0章|index] Copyright(c)2002 早坂千尋 Last Updated: Thursday, 23-Sep-2004 15:22:38 JST |