質問掲示板では「やってはいけない」と言われている処理をしているコードをよく見かけます。
今回は不適切な処理の例を紹介し、どう実装すれば良いかお答えします。
不適切な実装1. 裏画面処理をしていない
ゲームを作る際は必ず「裏画面処理」をしなければなりません。
理由は裏画面処理をしないで画像を動かすを見て頂ければ分かる通りで、
好き勝手なタイミングで描画すると画面がチラつきますし、ものすごい速さで処理を行ってしまいます。
(対処法はリンク先に載っています)
そしてこのような実装をしている人は、以下の2もやってしまっていることが多いです。
不適切な実装2. WaitやSleepを行っている。
FPS制御以外の部分で、Wait、Sleep系関数が含まれていたらその設計は間違いです。
「1秒待つ」「2秒待つ」ような処理で、毎回Waitしていたら、その間他の制御が出来ません。
シングルスレッドのゲームの設計において、どこか特定の部分で処理を止める設計は不適切です。
必ず一ループに一度メインループに処理を返すようにしましょう。
ではどうやって「1秒後」を判断するかですが、60Hzのモニタを使っている時、以下のコードでは処理が1秒間に60回まわります。
int Count=0;
while(!ScreenFlip()&&!ClearDrawScreen()&&!ProcessMessage()){
Count++;
if( Count==60 ){
//1秒たった時の処理
}
}
すなわちif文の中に入った時は、1秒たったことを意味します。
シングルスレッドのゲーム設計ではこのようにカウンタを使ったフレーム依存のコードになります。
しかし、使うモニタによってゲームの速度が変わるのはよくありません。
そこで、60Hz以上のモニタを使っている環境では全て60Hzにあわせるような処理をします。
ここに特定のFPSで動作させる方法を書いていますが、最初のうちは気にしないで構いません。
まずはWaitやSleepを書かない設計にしてみましょう。
不適切な実装3. あちこちにDXライブラリ3大処理がある
DXライブラリには必ず一ループに一度しなければならない3つの処理があります。
・ProcessMessage(); メッセージ処理を行います。
・ClearDrawScreen(); 画面のクリアを行います。
・ScreenFlip(); 裏画面を表画面に反映します。
この3つの処理がどれか1つでも複数個所に存在すると、それは間違った設計である可能性が高いです。
複数存在すべきではないことを理解した上で、適切な設計をしている場合を除き、
特定の処理を行う箇所で毎回この3つの処理をしているような設計はダメです。
メイン関数の書き方に書いてある通り、メインループの中から必要な処理を呼び出すようにしましょう。
不適切な実装4. LoadGraphScreen関数を使っている
これもこちらに書いている通りテスト用以外に使用してはいけない関数です。
ゲーム中「NowLoading...」のような表示をみたことがある人は多いと思いますが、
あれはHDDなどから、メモリに画像等のデータを展開している為に生じる時間です。
つまりHDDなどから、メモリに画像を展開するには時間がかかるのです。
一方、LoadGraphScreenはHDDなどからメモリに画像を展開して表示する関数です。
つまり、この関数を通る回数だけメモリに展開される処理が毎回行われてしまいます。
ゲーム中は、メモリに予め展開しておき、そのデータを使って処理を行います。
画像をロードして表示するにはこちらをお読みください。
- Remical Soft -