普段生活していると「割った余り」なんてあまり意識する事は無いかもしれません。
しかし、ゲームプログラムではこれを非常に重宝します。
ゲームプログラムでは「ループ」という処理を多用します。例えば
0→1→2→3 → 0→1→2→3 →
このような数値の流れがループです。
「割った余り」という考え方無しにこれを実現するには、
int x = 0;
while( ... ){
x++;
if( x == 3 ){
x = 0;
}
}
このような計算が必要です。しかし、「割った余り」を使うとこうなります。
int x = 0;
while( ... ){
x = ( x + 1 ) % 4
}
どうしてこうなるかというと、例えば今、
0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → ...
とカウントアップしているカウンタがあったとしましょう。
この数値を「4で割った余り」を下に並べて書いてみます。
0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → ...
0 → 1 → 2 → 3 → 0 → 1 → 2 → 3 → 0 → 1 → ...
どうでしょう。
4を4で割った余りは0、5を4で割った余りは1...ずっと同じ要領で計算すると、カウンタを特定の数値でループする数に変換出来ることが分かります。
このようにカウンタを使ってループする数値を作り出す手法はゲームプログラムでは大変重宝します。
以下に特定の場所でループ表示するサンプルを見てみましょう。
#include "DxLib.h" int Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey(){ char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る for( int i=0; i<256; i++ ){ if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定 int Count = 0; // カウンタ int Handle = LoadGraph("画像/キャラクタ01.png"); // 画像をロード // while(裏画面を表画面に反映, メッセージ処理, キーの入力状態更新) while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){ DrawGraph( 0, Count% 50, Handle, TRUE ); // 周期 50カウント でループ表示する DrawGraph( 100, Count%100, Handle, TRUE ); // 周期 100カウント でループ表示する DrawGraph( 200, Count%150, Handle, TRUE ); // 周期 150カウント でループ表示する Count++; // カウンタ加算 } DxLib_End(); // DXライブラリ終了処理 return 0; }
同じカウンタを使って異なるループの表示が可能になりました。
ゲームプログラムでは至る所で、この考え方を使います。次の章の「簡単な選択項目の作り方」でも使います。マイナス方向へのループの表現も紹介しているので、併せてご覧ください。
- Remical Soft -