ホームへ戻る

 3.2章 「割った余り」を使ってループを実現する

 普段生活していると「割った余り」なんてあまり意識する事は無いかもしれません。

しかし、ゲームプログラムではこれを非常に重宝します。

ゲームプログラムでは「ループ」という処理を多用します。例えば

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 -