スクリプトの基本

スクリプトの基本


ZGEのスクリプト記述を難しくしているのは、
実際には関数や変数を使ったスクリプトではなく、
スクリプトの実行順にあるのではないかと思います。

スクリプトは上から水が流れるように、
0〜49行を数字の小さい番号から順番に実行していくのですが、

慣れないうちはその流れが読めず、
実行させたい箇所を飛ばしてしまい処理がされないと言うミスが多いようで、
思った通りの結果になかなかならず、
難しく感じてしまうような印象があります。


例えば上図のようなスクリプトの場合、
8行目で条件により9行か12行に飛ぶようにしていますが、
右の図のように10行目に berak というスクリプト実行終了の関数を記述してしまうと、
9行目を実行した後は11行目以降のスクリプトは実行されない事になってしまいます。

逆に実行したくないタイミングで処理されてしまう場合も考えられますが、
原則として流れがない箇所のスクリプトは実行されないので、
自分が組んだスクリプトにおいて飛び先を指定したものに関しては、
必要な処理を実行するよう
注意してスクリプトの流れを意識するようにしましょう。

また、実行順によって意図した結果が出ない場合もあります。

例えばキャラクターのスクリプト実行を移動計算無しで行った場合、
移動計算(char_move 関数)を記述する必要がありますが、
移動量や座標を補正する関数は、
この“移動計算”の後に実行しないと効果が現れません。

in_screen 関数は移動するキャラクターイベントを画面外に出ないようにする関数ですが、
その処理内容は画面外に出たら移動速度と座標を補正すると言うものです。
つまり、移動計算を実行した時に初めてキャラクターが動き、
そこで画面外に出ると言う結果になる訳ですから、
移動計算の前に座標を補正する関数を実行しても、
次のフレームで処理されると言う結果になってしまいます。
(衝突後に移動速度と座標を補正する hit_evt_act や map_hit_act のような関数も同様です)

始めたばかりの人やこれから始めようとする人には上記の話は理解しにくいものがあるかと思いますが、
実行順で結果が変るものがあると言う事は理解しておいてください。

■関数と変数

変数とはよく“入れ物”に例えられますが、
ZGEでは予め用意されたものも多く存在し、
その変数から参照したり代入する事で、
簡潔に情報を扱うこともできます。

例えば cXnops と言う変数にはキャラクターの座標が代入されていて、
この値を取得すると今の座標が分かり、
この値に代入するとキャラクターの座標が変更できると言った感じです。

その中でユーザーが自由に扱える変数としては以下のようなものがあります。
『 b 』…0〜63(整数・ビットフラグ)
『 i 』…0〜63(整数)
『 l 』…0〜31(整数)
『 f 』…0〜11(整数・小数点)
『 g 』…0〜99(整数)

g 以外の変数はスクリプトを実行しているキャラクターが独自に扱えるもので、
call_script で呼び出したスクリプトも同じものを扱う事になります。
その中でも f は唯一小数点を扱える変数となっていて、
使用できる数も少ないので必要な時以外は使わないよう気をつけた方が良いです。

その為、1つのキャラクターイベントが自由に使える変数は、
b + i + l の合計160あると考えられます。

g は特殊で全てのキャラクター間で共通のものとなり、
シーンを変更してもその値が保持されると言う特徴があります。
ユーザーが自由に扱える変数の中では数が最も多いですが、
性質上どうしても多用していると数が足りなくなりやすいので、
f 同様に必要と思える場合に使っていく形が好ましいです。

また、一部のイベントや使用する関数によっては、
すでに変数の用途が決められているものも存在します。

変数がどうしても足りない場合、
保持させるキャラクターイベントを別途用意し、
そこから代入・取得すると言う事も可能です。

■スクリプトを組む前に

ZGEを使い始める時に敷居の高さを感じるのがスクリプトだと思いますが、
スクリプト全体の流れ以外にも、
始めたばかりだと関数と整数の使い方がなかなか理解できないと思います。

スクリプトは関数と変数の組み合わせですが、
まずその組み合わせ方が分からないと言う人も多いのではないでしょうか。

最初に必要な事は、
『どういった動作をさせたいのか』と言う事です。
キャラクターを動かす等なんでも良いので、
とにかく明確に作りたいものを想像します。

そして次にその動作に必要な関数を探していきましょう。

ZGEにはリファレンスの記載されたヘルプも付属していますが、
始めたばかりではどういった関数があるのかも分らないと思うので、
スクリプト編集画面にて F1 キーを押して“関数入力支援”と言うものを表示してみるのがお勧めです。


カテゴリ別に別れているので、
目的別に探しやすくなっています。

最初はこれを利用してどんな処理をする関数があるのかを、
少しずつ使いながら覚えていくのが良いと思います。

また、スクリプト編集画面の下部は、
現在選択している行の変数や引数で選択している変数の説明も表示されるので、
これも合わせて参考にすると覚えやすいです。

▲左側が関数で右側が変数の説明になっています


例えば then 関数を選択して引数1に sKArJ_U と言う変数を選択している場合、




上記のような説明が表示されます。

この説明を見ながら使用する変数を選択していくと便利です。

■関数と変数の使い方

ここまで、スクリプトの組み方や関数・変数の選択方法を説明しましたが、
まだ具体的に関数や変数と言うものが理解できない人も多いかと思います。

スクリプトは変数による分岐が肝となりますが、
分岐は『戻り値(cRetVal)』に格納された値と、
then 関数(もしくは if 関数)による比較で行う場面が多いです。

戻り値と言うのは関数を実行した後に発生する一時的な値が格納された変数で、
その戻り値を利用してその結果から分岐させると言うのが
ZGEでのスクリプトの基本とも言えるかもしれません。

例えば衝突判定を行う hit_evt 関数の説明を見てみましょう。

この関数を実行した時に cRetVal と言う変数に衝突したイベントの合計の数が格納されると言う表記があります。
つまり hit_evt の後に cRetVal の値が0なら、
hit_evt の引数1〜2で指定したキャラクターイベントとは衝突しておらず
1以上なら対象と衝突したとも言える訳です。

ここで、衝突したかどうかで分岐させたい場合、
then 関数を使う事でその判断が可能になります。

then 関数の説明は以下の通り、

ここで引数1に戻り値の格納された cRetVal を選択し、
2に cRetVal が0以外(衝突していると判断される時)の飛び先の行番号、
3に cRetVal が0の時(衝突していなかったと判断される時)の飛び先の行番号を記入します。

敵に衝突してダメージを受けると言うような処理にしたい場合、
then 関数の引数2で指定した飛び先で、
ライフの判断用に使用する変数の値を減算すれば、
一応ですがダメージを受けてライフが減るような処理として扱う事ができるはずです。

さらに下記のようにライフの値として扱う変数を if(>)more 関数で比較する事で、
ライフが0ならキャラクターが sleep 状態になると言う処理もできます。

つまりZGEのスクリプトと言うのは、
こうした判断による分岐の積み重ねで、
変数はその判断材料となる物と考えて頂ければ良いかもしれません。

また、予め用意された変数は分岐の判断として使えるものが大半で、
そうした変数と処理を実行する関数の組み合わせによって、
キャラクターの動作の流れを作ると事が、
事実上スクリプトを組むと言う作業になるとも言えます。

その為、完全に関数や変数の名前を覚えなくとも、
最低限どういった動作をするものがあるのかを覚える事は、
ZGEでスクリプトを組む為に必要です。

■変数の入力方法

変数は関数のように入力支援がなく、
どういった内容のものがあるのかはマニュアルで確認するしかありません。
時間がある時にマニュアルを眺め、
どういった内容のものがあるか簡単に覚えておくのがお勧めです。

変数の入力に関しては表示された中から選択するか、
手入力する方法がありますが、
v2.6.3 以降から手入力に候補が表示される機能が備わっているので利用しましょう。

キャラクターの X 座標が格納された cXnops を探してみたいと思います。

変数は関数にある引数で変数を入力する箇所で選択できるので、
ここでは下図の2行目 if(>)more 関数の引数1をクリックして、
『cx』と入力してください。


そうすると、スクリプト入力画面の右下の方に、
cx で始まる変数が表示されたと思います。




この候補の中の『cXnpos』をクリックすれば、
先ほどの引数1に cXnpos が記述されます。

候補の表示は関数にもありますのでぜひ活用しましょう。

ちなみにですが、
関数や変数の名前を覚えてしまっているなら、
そのまま入力する事も可能です。

それぞれ入力方法は『ZGEとは』にある『入力方法』にて詳しく説明しています。



▲フレームが表示されない人はクリック