other.cppについて
ここのシートには、どこに入れればいいのかよくわかんなかった関数が詰め込まれています。全部main.cppに移してもいいかもしれませんね。
このシリーズ読まなくてもコメントアウト見れば大体分かるような気がしてきた。
このシリーズ読まなくてもコメントアウト見れば大体分かるような気がしてきた。
GetKeyInput関数について
// キーボードの押下時間を調べる関数
void GetKeyInput( int *KeyBuf ){
char damy[256]; // 押下状況を格納する配列
GetHitKeyStateAll( damy ) ; // 押下状況を格納
for( int i=0 ; i<256 ; i++ ){ // 全要素
if( damy[i] == 1 ) // 押下されていたら
KeyBuf[i]++; // インクリメント
else
KeyBuf[i] = 0; // ゼロにする
}
if( Key[KEY_INPUT_F] == 1 ) //printfDx関数で書かれた文字を消す
clsDx();
}
これについての詳細はキーボードの押下時間を調べる方法を見てください。なお、関数の最後にあるif文ですが、「Fキーが押されたらprintfDx関数で書かれた文字を消す」ための処理です。printfDx関数は主にデバッグの際に使用します。また、この関数で描画された文字は普通に裏画面をクリアするだけでは消すことが出来ません。そのため、このclsDx関数を呼び出して消してやる必要があります。どこに書こうか迷ったのですが、とりあえずこの関数に書きました。特にFキーである必要はありません。ホームポジションという理由から選びました。
LoadFiles関数について
// ファイルを読み込む関数
void LoadFiles(){
Title.Load();
GameMain.Load();
GameClear.Load();
GameOver.Load();
BgmControl.Load();
SeControl.Load();
}
それぞれの構造体のロード関数を呼び出しています。私の中で、ロードの仕方には2択ありました。各構造体に必要な画像、音声を読み込ませ、その構造体でそのまま使用する方法と、画像や音声を専門に格納する構造体を用意し、使用するときはその構造体にアクセスするというものです。前者は別の構造体にアクセスする必要が無いので、管理が楽になります。後者は管理が面倒くさい代わりに、構造体間で共通の情報を扱うことが出来ます(前者でも出来ますが、分かりにくい構造になります)。どちらが有効かは場合によります。この基盤では、画像ファイルは各構造体に格納し、音声ファイルは音声専門構造体に格納する方法を取りました。画像はあまり共通して使用する場合がないのですが、音声ファイルは構造体間で共有して使用する場合があります。 たとえば、タイトルのメニュー選択で使用する効果音と、ゲーム中のメニュー選択で使用する効果音を共有したい場合などがあります。
ChangegameState関数について
// ゲームの状態を変更する関数
void ChangeGameState( int NewGameState ){
GameState = NewGameState; // ゲームの状態を更新
switch(GameState){ // 新しいゲームの状態の初期化を行うための分岐
case GS_TITLE:
Title.Init();
break;
case GS_MAIN:
GameMain.Init();
break;
case GS_CLEAR:
GameClear.Init();
break;
case GS_OVER:
GameOver.Init();
break;
}
}
これは、引数に指定されたゲームの状態に変更し、指定されたゲームの状態を呼び出すために初期化の関数を呼び出す関数です。つまり、
- タイトル画面からゲームに移るとき、ゲームの初期化関数を呼び出します
- ゲームからゲームクリアに移るとき、ゲームクリアの初期化関数を呼び出します
- ゲームからゲームオーバーに移るとき、ゲームオーバーの初期化関数が呼び出します
このような機能を持っているのです。だからゲームの状態を変えたいときはGameStateに直接代入したりせず、この関数を呼び出してGameStateの値を変更し、初期化関数を呼び出すようにしましょう。ちなみに、BGMの管理もこれに似た構造を持っています。新しいBGMを流せと関数を呼び出すと前に流れていた曲をとめてから再生を開始します。
タイトル画面に変更したいときはこのように呼び出します
タイトル画面に変更したいときはこのように呼び出します
ChangeGameState( GS_TITLE );
これでタイトル画面の初期化をしてからタイトル画面に移動することが出来ます。