Cisqua はゲームを構成する基本的な部品を組み替えることができる仕組みを採用しているため、定められた関数を公開している DLL を作成すればゲームを組み替えることができます。 Cisqua では、ゲーム画面の描画やデータを制御する DLL をゲームスクリプト DLL と定めて、以下の関数を呼び出します。
このらの関数は実行時に cisqua.dll から検索されて呼び出されます。 そのため、CALLBACK で関数を修飾し、__declspec(dllexport) または必要に応じてモジュール定義ファイルを用意して関数を外部に公開なければなりません。
Cisqua がゲームスクリプト DLL に必須として要求する関数は、必ず cqs という接頭辞を持ちます。
ゲームスクリプト DLL が描画処理ルーチンやイベント処理でどのような動作をするかは開発者の自由です。 開発者はコンテナやレイヤオブジェクトのプログラムを再利用しながら、ゲームの挙動部分のコーディングに集中することができます。 以下のプログラムは、ルートレイヤに対して受け取ったイベントの内容を描画する単純なテストプログラムです。
#include "../cisqua.h"
cqILayer rootLayer = NULL;
TCHAR text[1024];
__declspec(dllexport) BOOL CALLBACK cqsInitialize(PCTSTR param, cqILayer layer) {
if (rootLayer) {
rootLayer->Release(rootLayer);
}
rootLayer = layer->SmartCopy(layer);
text[0] = 0;
return TRUE;
}
__declspec(dllexport) VOID CALLBACK cqsRelease() {
if (rootLayer) {
rootLayer->Release(rootLayer);
}
}
__declspec(dllexport) BOOL CALLBACK cqsOnDrawNext() {
HDC hdc;
RECT rect = { 0 };
rect.right = rootLayer->GetWidth(rootLayer);
rect.bottom = rootLayer->GetHeight(rootLayer);
hdc = rootLayer->GetDC(rootLayer);
FillRect(hdc , &rect , GetStockObject(WHITE_BRUSH));
SetTextColor(hdc , 0);
DrawText(hdc , text , -1 , &rect , DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rootLayer->DeleteDC(rootLayer , hdc);
return TRUE;
}
__declspec(dllexport) VOID CALLBACK cqsOnMouseDown(DWORD button , LONG x , LONG y) {
wsprintf(text , TEXT("OnMouseDown X=%d , Y=%d") , x , y);
}
__declspec(dllexport) VOID CALLBACK cqsOnMouseUp(DWORD button , LONG x , LONG y) {
wsprintf(text , TEXT("OnMouseUp X=%d , Y=%d") , x , y);
}
__declspec(dllexport) VOID CALLBACK cqsOnMouseMove(LONG x , LONG y) {
wsprintf(text , TEXT("OnMouseMove X=%d , Y=%d") , x , y);
}
__declspec(dllexport) VOID CALLBACK cqsOnKeyDown(int vkey) {
wsprintf(text , TEXT("OnKeyDown keyChar=%c keyCode=%d") , vkey, vkey);
}
__declspec(dllexport) VOID CALLBACK cqsOnKeyUp(int vkey) {
wsprintf(text , TEXT("OnKeyUp keyChar=%c keyCode=%d") , vkey, vkey);
}
__declspec(dllexport) BOOL CALLBACK cqsCanSave() {
return FALSE;
}
__declspec(dllexport) BOOL CALLBACK cqsCanLoad() {
return FALSE;
}
このプログラムは src フォルダの中にサンプルとして収められています。 また、cisqua.dll と同一のフォルダには、このプログラムをコンパイルした test.dll が格納されています。 setup.ini ファイルの SCRIPTER_MOD の値を test.dll に変更すれば、実行されるモジュールが coud.dll から test.dll に切り替えられます。
test.dll を実行すれば、コンテナからイベントが通知されるタイミングを視覚的に確認することができます。
関数 | 解説 |
---|---|
BOOL CALLBACK cqsInitialize(PCTSTR param, cqILayer); | 初期化します。 |
VOID CALLBACK cqsRelease(VOID); | ※将来必須の可能性のある予約関数です |
BOOL CALLBACK cqsOnDrawNext(VOID); | 次の場面に移行します。 |
VOID CALLBACK cqsOnMouseDown(DWORD button , LONG x , LONG y); | マウスボタンが押されたイベントを処理します。 |
VOID CALLBACK cqsOnMouseUp(DWORD button , LONG x , LONG y); | マウスボタンが離されたイベントを処理します。 |
VOID CALLBACK cqsOnMouseMove(LONG x , LONG y); | マウスカーソルが移動したイベントを処理します。 |
VOID CALLBACK cqsOnKeyDown(int vkey); | キーボードのキーが押されたイベントを処理します。 |
VOID CALLBACK cqsOnKeyUp(int vkey); | キーボードのキーが離されたイベントを処理します。 |
VOID CALLBACK cqsSave(PCTSTR); | ゲームの現在の状態を保存します。 |
VOID CALLBACK cqsLoad(PCTSTR); | ファイルからゲームの中断データを再開します。 |
BOOL CALLBACK cqsCanSave(VOID); | 現在のスクリプトの状態を保存できるかどうかを取得します。 |
BOOL CALLBACK cqsCanLoad(VOID); | 現在のスクリプトがデータを再開できるかどうかを取得します。 |
ゲームの状態を完全に初期化します。
BOOL CALLBACK cqsInitialize(PCTSTR param, cqILayer layer);
VOID CALLBACK cqsRelease(VOID);
ゲームを次の場面に移行します。
BOOL CALLBACK cqsOnDrawNext(VOID);
マウスボタンが押されたイベントを処理します。
VOID CALLBACK cqsOnMouseDown(DWORD button , LONG x , LONG y);
マウスボタンが離されたイベントを処理します。
VOID CALLBACK cqsOnMouseUp(DWORD button , LONG x , LONG y);
マウスカーソルが移動したイベントを処理します。
VOID CALLBACK cqsOnMouseMove(LONG x , LONG y);
キーボードのキーが押されたイベントを処理します。
VOID CALLBACK cqsOnKeyDown(int vkey);
キーボードのキーが離されたイベントを処理します。
VOID CALLBACK cqsOnKeyUp(int vkey);
指定したファイルに現在のゲームデータを保存します。
VOID CALLBACK cqsSave(PCTSTR filePath);
指定したファイルからゲームデータを読み込みます。
VOID CALLBACK cqsLoad(PCTSTR filePath);
この関数が TRUE を返す場合 cqSave() 関数を安全に呼び出すことができます。
BOOL CALLBACK cqsCanSave(VOID);
この関数が TRUE を返す場合 cqLoad() 関数を安全に呼び出すことができます。
BOOL CALLBACK cqsCanLoad(VOID);