プログラミング言語 NASC

第1章 やさしい入門


 まずは、NASCを手短に紹介することから始める。われわれの目的は、細かい点や、公式の規則(そんなものは無い)や、例外に深入りせず、実際のプログラミングによってNASCの本質的な要素を示すことである。ここでは、完全あるいは正確であることは二の次とする。
 ここでは、読者はC言語の極めて基本的な事柄(変数の宣言や if文の文法、{ }や( )の使い方)を理解していることを前提として話を進めることとする。

1.1 手始めに

 新しいプログラミング言語を学ぶ唯一の道は、それでプログラムを書いてみることである。最初に書くべきプログラムは、どんな言語でも同じで、例えば次のものである。

hello, world
という単語を印字せよ。

 しかし、NASCは「何か」のイベント処理を目的とした言語なので、上記の例は不適切である。そもそもNASCには印字機能に相当するものは無い。

 そこで、ここでは見切れ処理を例題として取り上げる。
 見切れとは、sakura 側のキャラクタが、画面外にはみ出した状態のことである。
 「何か」から梨野に対してこの情報は、OnSecondChangeOnMinuteChange 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;
 ここでは、int型の変数 mikiref を定義している。宣言された変数には、0 が代入される。
 変数の定義はスクリプトの読みこみの時に一度だけ行われ、以後イベント発生でスクリプトが実行される時には無視される。宣言された変数の内容は保持され、次回イベント発生時に引き継ぐ。

 三行目
if(strcmp(event,"OnSecondChange")==0){
 ここでは、OnSecondChange イベントの発生の検出を行っている。
 strcmp() は二つの文字列の比較を行う組込関数で、動作は ANSI-C の strcmp() と同一である。event は、NASCの使用する文字列変数である。この中には、「何か」から渡されたイベント名が入っている。strcmp() は、二つの文字列が一致した場合に 0 を返す。この行では、event の内容が "OnSecondChange"と一致した場合、if文の条件判定が真となり、続く { } の中の処理が行われる。

 四行目
    if(atoi(reference1) == 1){              // 見切れ
 この行では、見切れが発生しているかどうかを判定している。reference1 は三行目のevent と同じく、NASCの使用する変数である。この中には、「何か」から渡されたイベントの reference1 が文字列として入っている。 reference0 から reference7 が同様に使用できる。
 見切れ発生時には、この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