プログラムにはいる前にSFXVI(に限らずリアルタイム処理) プログラムの動作概念について説明したいと思います。 この概念がつかめないとプログラムをつくるのは難しいと思いますので。
まず第一に重要なことはコンピュータは同時に複数の処理を行なうことは出来ないということです。 「マルチタスク〜」と呼ばれる処理であっても同じことです。
では複数のプログラムが同時に動いているように見えるのは何故でしょう?
シューティングゲーム(以下STG)を例にとって説明してみましょう。 STGはだいたいにおいて、自機を動かす、自弾を動かす、敵を動かす、敵弾を動かす、 といったサブルーチンから成っています。
これらのサブルーチンは一回呼び出されるごとに、キャラを少しだけ移動させたりします。 自機を動かすルーチンでは、レバーの状態を見てその方向に1ドット移動させる。 自弾を動かすルーチンでは弾を1ドット前に移動させ、画面外に出たり敵に当たったりしていたら消滅させる。 といったように動作の単位が非常に細かくなっています。
ということは、これらのルーチンを高速に繰り返し呼び出せば、自機はレバーで自由に動かせ、 弾はまっすぐに飛んでいきます。複数のキャラクターが同時に動いているように見えるのです。 これがリアルタイム処理の原理です。
ここでいう「高速」とはたいていの場合約1/60秒です。 この数字はよく知られているようにディスプレイの表示間隔です。これ以上速い間隔で書き換えても、 表示されないので無意味ですし、逆にこれより長い間隔で書き換えると、 止まっている時間が目につくようになるので滑らかな動きが表現出来なくなる場合もあります。
というわけで、リアルタイム処理を行なうには、 呼ばれるたびに少しずつ処理を行なうようなプログラムをかけばいいのです。
では、そういった処理をするためのプログラムはどのように書けばいいのか。
簡単に書くと次のような流れのプログラムになります。
この関数は引き数を増加させながら繰り返し呼び出すことで処理を完成させることになります。 ただし、次にどの処理を行なわせるか、つまり引き数を増加させるのは関数の外で管理する必要があります。
void 昇龍拳(int c) { if(c==1) {cが1の時に行なう処理} if(c==2) {cが2の時に行なう処理} if(c==3) {cが3の時に行なう処理} .... .... .... if(c==n) {cがnの時に行なう処理} }
SFXVIの技のプログラムの場合も同じようになりますが、 カウンタを関数の内部で管理するので、関数の独立性が高くなります。
void アッパー(int p1,int p2) { short c=カウンタ初期設定(10); if( c >= 10 ) { 呼ばれた最初のサイクルに行なう処理 } else if( c >= 5 ) { 9 ≧ c ≧ 5のとき行なう処理 } else if( c >= 4 ) { cが4のとき行なう処理 } else if( c >= 1 ) { 3 ≧ c ≧ 1のとき行なう処理 } else { c==0のとき行なう処理 } }
基本的な構造は上の例と同じで、cの値によって行なう処理が変わるようになっています。 違いはcの発生源だけです。cはカウンタ初期設定()という関数から得ています。
カウンタ初期設定()という関数はSFXVIの持つ機能で、「内部カウンタの値を得る。 と同時に、初めて呼び出された時は内部カウンタに引き数を初期値として設定し、 2回目以降は内部カウンタを1減少させる」という関数です。
例の場合では、最初に呼び出された時はカウンタの値は10になり、以降呼び出される毎に、 カウンタが1ずつ減っていくというわけです。
リアルタイム処理プログラムの原理が理解出来たところで、 次はSFXVIプログラムの原理の解説に入ります。
SFXVI本体は、アルゴリズムやキー入力などを参考にし、次に呼び出す動作IDを決定します。 動作IDが決定されると内部カウンタを初期化して対応する動作関数を呼び出します。 そして、この動作関数は、動作が完了するか、動作IDが変化するまで毎サイクル呼び出されます。
動作関数は一部がSFXVI本体内に定義されていますが、ほとんどが外部、つまり ACTION.Xで定義されます。ということでACTION.Xをつくる=動作関数の集合体をつくるわけです。
昇龍拳なら昇龍拳の、足払いなら足払いそれぞれの動作関数を定義しておくだけで、 システムが必要に応じて関数を呼び出します。攻撃がヒットしたかどうかなど 面倒なことはすべてシステムが行なってくれるので、ACTION.Xは純粋な動作を定義するだけですみます。 ゼロからゲームをつくるのに比べて遥かに楽であるといえます。
以上で動作原理についての説明を終わらせていただきます。 SFXVIがキャラクタデータに極力負担をかけない作りになっていることがおわかりになりましたか。
あとは公開されているソースを眺めて、実際の動きと見比べてみると、いいと思います。