スクリプト仕様の再設計4
# ひたすらチラシの裏
# リファクタリングするにあたって,まず現行スクリプト仕様を書きなぐって,
# で,おかしいなと思った所を修正してみる.
# コマンドについて
↓
# 基本的にはリファクタリングが大目的なので,スクリプト仕様はそこまで変化してません.
# ので,「シューティング用スクリプト2」で晒しているスクリプトが多少参考になるかもしれません.
■ コマンドの種類
スクリプトのコマンドは,大きく分けると6つの動作を行う.
1. 実行時間の制御.「ここで何フレーム待つ」コマンドなど.地味に一番重要.
2. 実行ポインタの制御.ループ,分岐,サブルーチンなど.
3. リソース読込/操作.Bitmap/Model/Sound などをFile→Memory→Device転送(再生)
4. 対象オブジェクトのメンバ変数の書き換え(id:keim_at_Si:20050520参照).
5. 子オブジェクトの生成.例えば「敵」が「弾」を生成.
6. 子ファイバの生成.一つのオブジェクトを複数ファイバで動かす場合.
■ 実行時間の制御コマンド
「wait, waitif, end」 のどれかのコマンドが現れるまで,
連続したコマンドは,1Frame の間に連続して実行される.
これらのコマンドが表れない限り,延々と処理を続ける事になる.って事は,
無限ループの中にこれらのコマンドが存在していない場合,フリーズする.
1Frame だけ進める場合は,「wait 1」と書く.
wait [term] // term フレームの間待機.term = 0 で無限待機. waitif [Form], [term] // Form != 0 になったら次へ.それ以外は wait と同じ. end // ファイバを破棄する.
■ 実行ポインタの制御コマンド
ループ.BASICっぽい FOR 文.
[Value_ID] に,ループ制御に用いるレジスタを指定する.
[start], [end], [step] は,浮動小数点値.
最初に [Value_ID] = [start] が代入されて,1回し毎に [Value_ID] += [step] される.
[Value_ID] が [end] を超えたら,"next"コマンドの次に進む.
※ [Value_ID] == [end]の場合は,1回し実行される.
例えば5ループさせたい場合,「for a, 0, 4, 1」と書く.
[start] == [end] なら無限ループとなる.
"continue" コマンドなら for 位置に,"break" コマンドなら next の次の位置に飛ぶ.
for のネストは,レジスタが許す限り無限に可能.
for [Value_ID], [start], [end], [step] continue break next
サブルーチンコールと復帰.BASICっぽい GOSUB〜RETURN 文.
現在の実行位置をスタックに記録して,sub [SubRoutine_ID] でマークした位置まで飛ぶ.
return が現れたら,スタックに記録した位置に戻る.スタック容量の関係でネストは8回まで.
gosub [SubRoutine_ID] // "sub [SubRoutine_ID]" の位置まで飛ぶ. return // 戻る.スタックが空なら"end"として振る舞う. sub [SubRoutine_ID] // ジャンプ先
選択.BASIC の select を拡張?select〜selend までで,条件分岐.
level コマンドは,小さい順に書いていくと,その間の値のスクリプトを実行する.
level コマンドで条件分岐する場合は,case,range の混在は不可.
"break" は必要無し.次の条件文が表れたらselend の次の位置に飛ぶ.
select文のネストは無限に可能.
select [From] case [value] // [From]が,指定値と同値なら実行. level [value] // [From]が,指定値以上,次指定値未満なら実行. range [min], [max] // [From]が,[min]以上[max]以下なら実行. default // 条件に当てはまらなかったら実行. selend
分岐.BASICっぽい IF 文.[Form]!=0 なら,if 以下を実行.
[Form]==0 なら else 以下を実行.無ければ,endif の次にジャンプ.
if のネストは無限に可能.
if [Form] else endif
エラージャンプ.0除算,索敵失敗などが有った場合,エラーフラグが立つ.
エラーフラグが立っていた場合,error 〜 enderror を実行.エラーフラグは消える.
エラーフラグが立っていなければ,enderror の次の位置まで飛ぶ.
error enderror
外部スクリプトを挿入する.
include "file_path"
■ リソース読込/操作コマンド
ビットマップ管理.
LoadBitmap で,"file_name" をシステムメモリに展開→テクスチャマップに転送.
[BitmapID]で指定した名前でスクリプト内から呼び出せるようにする.
bTransPurple = 1 なら,真紫色[RGB(255,255,0)]を透過する.
LoadRGBA; アルファ値情報を含む "*.rgba" データを読み込む.
RegBitmap, UnregBitmap; テクスチャマップに登録/抹消を手動で行う.
UnloadBitmap; システムメモリ上から手動で削除する(アプリケーションの終了で自動解放).
LoadBitmap [BitmapID], "file_name", bTransPurple LoadRGBA [BitmapID], "file_name" UnloadBitmap [BitmapID] RegBitmap [BitmapID] UnregBitmap [BitmapID]
3DModel管理.
LoadModel で,"file_name" をシステムメモリに展開→スケーリング→Display List 生成.
[ModelID]で指定した名前でスクリプト内から呼び出せるようにする.
bDivide = 1 なら,パーツ単位で別々の Display List として生成.
CompModel, UncompModel; Display List 生成/破棄を手動で行う.
UnloadModel; システムメモリ上から手動で削除する(アプリケーションの終了で自動解放).
LoadModel [ModelID], "file_name", scale_x, scale_y, scale_z, bDivide UnloadModel [ModelID] CompModel [ModelID], bDivide UncompModel [ModelID]
Sound管理.命名則が上と同じなので,略.
LoadSound [SoundID], "file_name" UnloadSound [SoundID] LoadMusic [MusicID], "file_name" UnloadMusic [MusicID]
# 仕様の走り書きだけ書いても,何か意味分かりにくくて,微妙.
# かといって,真面目な仕様書は,多分,書けないし.アマチュアクオリティ.
# ...ソースも公開するともうちょっとマシなんだろうな...
# ゲーム完成したらソースも公開するつもりです.
(つづく)