1.1 フレーム

1.1
フレーム
ゲーム処理の中心となる概念
従来のプログラムの流れ
入力処理は入力が確定するまでずっと待つ
►エンターキー以外は押しても処理は進まない
►入力中は一切他の処理をすることが出来ない
(つまりフリーズしてるのと一緒)
これはゲームには向いていない
►別の考え方が必要となる
処理
処理
scanf
1.1 フレーム
2
フレームを用いたプログラムの流れ
入力処理は入力の有無を確認したらすぐ終わる
►これを何度も行うことで入力を感知している
►フリーズしたようにはならない
これならゲームに向いている
これが1フレーム
処理
Check
Hit
Key
処理
1.1 フレーム
Check
Hit
Key
処理
3
フレームとは
ゲームの処理の1単位
►無限ループの1回分の処理が1フレームにあたる
...
if (DxLib_Init()) return -1;
while (1) {
if (ClearDrawScreen()) break;
// ここに処理を書くけど
// 今回は何も書かないよ
これが1フレーム
if (ProcessMessage()) break;
}
DxLib_End();
...
1.1 フレーム
4
フレーム内での処理の流れ
...
while (1) {
if (ClearDrawScreen()) break;
画面消去
演算
// キー入力をチェックして移動処理
if
if
if
if
(CheckHitKey(KEY_INPUT_LEFT)) x--;
(CheckHitKey(KEY_INPUT_RIGHT)) x++;
(CheckHitKey(KEY_INPUT_UP)) y--;
(CheckHitKey(KEY_INPUT_DOWN)) y++;
画面描画
// 背景を白で塗りつぶし
DrawBox(0, 0, 640, 480, 0xffffff, TRUE);
// プレイヤーを画面に表示
LoadGraphScreen(x, y, "player.bmp", FALSE);
if (ProcessMessage()) break;
} ...
1.1 フレーム
ウィンドウ処理
5
画面消去
画面に表示してある内容をすべて消去する
►1つのキャンバスを使いまわして表示している
►毎フレーム最初にすべて消去する必要がある
ClearDrawScreen() がその役割を担っている
...
while (1) {
if (ClearDrawScreen()) break;
// キー入力をチェックして移動処理
エラー時は
成功すると0を返すので偽
...
エラーが発生すると-1を返すので真
1.1 フレーム
breakする
6
演算
雑多な計算処理を行う
►キー入力の有無の確認
►キャラクターの座標の変更
(ここでは x や y がそう)
►当たり判定 など
ゲームプログラミングでは
►座標の原点は画面左上
►右下が正方向
となることに注意しよう
...
// キー入力をチェックして移動処理
if (CheckHitKey(KEY_INPUT_LEFT)) x--;
if (CheckHitKey(KEY_INPUT_RIGHT)) x++;
もし左カーソルキーが押されていたら、座標を左に移動
if (CheckHitKey(KEY_INPUT_UP)) y--;
if (CheckHitKey(KEY_INPUT_DOWN)) y++;
...
1.1 フレーム
7
画面描画
画面に画像や図形を表示する
►パラパラマンガの要領でアニメーションさせる
(座標を毎フレームちょっとずつずらす)
コードは上から下へ実行される
►先に描いた画像や図形は上から隠される
...
// 背景を白で塗りつぶし
DrawBox(0, 0, 640, 480, 0xffffff, TRUE);
"player.bmp"を読み込んで、座標(x, y)に表示する
// プレイヤーを画面に表示
LoadGraphScreen(x, y, "player.bmp", FALSE);
...
1.1 フレーム
8
ウィンドウ処理
文字通り、ウィンドウの処理を行う
(ウィンドウの移動、閉じるボタン など)
►やらないとフリーズするので注意
ProcessMessage() がその役割を担っている
...
// 背景を白で塗りつぶし
成功すると0を返すので偽
エラーか
DrawBox(0,
0,
640,
480,
0xffffff,
TRUE);
エラーが発生または
閉じられた時は
// プレイヤーを画面に表示
閉じられると-1を返すので真
breakする
LoadGraphScreen(x, y, "player.bmp", FALSE);
if (ProcessMessage()) break;
} ...
1.1 フレーム
9