ODEで学ぶC言語 [Step3:switch文とキー処理関数]


step3サンプルプログラムの実行画面

step3サンプルプログラムの実行画面

Step2でfor文を使った繰り返しを練習したので,ここではswitch文を使ったキー処理の方法を学びます.

ゲームなどではキーボードでレーザービームを発射したり,車を操縦しますね.ここでも,キーボードからのキー入力を処理する方法を学びます.

switch文とキー処理

新しく登場したのが11行目のcommand関数です.これは,キーボードからのキー入力を引数cmdとして受け取ります.下のプログラムではキー入力の値に応じてswitch文を使い分岐させ違う処理をさせています.zが入力されると初期位置のz成分を0.1m増加させます.つまり,zキーを押すたびに直方体全体が上空へ上がっていきます.その下のbreak文は忘れないでください.その他のキー入力ではdefaultにある”Input z key”という文字列がコンソール画面に表示されます.

乱 数

ODEとは関係ありませんが乱数も登場します.乱数を使う場合は”stdlib.h”をインクルードします.ここではtime()関数も使っているので”time.h”もインクルードしています.次に,main関数の42行目で乱数を初期化しています.void srand(unsigned seed)の引数seedは乱数を発生させる種を入れます.それが同じ値の場合は,常に同じ乱数系列を発生させます.srand(time(NULL))は実行時に乱数の種を変更する一般的な方法です.

実際に乱数を発生させているのがsimLoop関数の30行目のrand関数です.rand関数のプロトタイプ宣言はint rand(void)なので引数は取らず,int型の値を返します.RAND_MAXは乱数の最大値なので,30行目は0以上1以下の乱数を発生させ,それを赤成分の値に代入します.従って,表示されている直方体(以下ボックスと表記)の赤成分の色だけが変わることになります.

今回は2つのことを学びました.特に乱数はゲームで使うと非常に面白いゲームになるのでしっかり覚えておきましょう.

でむ

/* step3 キー入力 switch文 */
#include "dm3.h"
#include <time.h>
#include <stdlib.h>

double R[12];  // 回転行列の要素が格納される配列
double p[3] = {0.0, 0.0, 0.05};   // 位置(x,y,z)[m]
double sides[3] = {0.1, 0.1, 0.1}; // 直方体のサイズ(x, y, z)[m]
double start_x = 0.0, start_y = 0.0, start_z = 0.0; // 初期位置

void command(int cmd)
{
    float xyz[3], hpr[3];
    switch (cmd) {
        case 'z':
            start_z += 0.1;
            break;
        default:
            printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ ***/
{
  int i, j, num = 11;          // 直方体の数
  static float red = 0.0, green = 0.0, blue = 0.0; // 赤,緑,青成分

  for (i = 0; i < num; i++) {
      for (j = 0; j < num; j++) {
        red = (float) rand()/RAND_MAX;   // 赤成分を乱数で決定
        dsSetColor(red, green, blue);    // 色の設定
        p[0] = start_x;                  // 位置のx成分
        p[1] = i * 0.2 - 1.0  + start_y; // 位置のy成分
        p[2] = j * 0.2 + 0.05 + start_z; // 位置のz成分
        dsDrawBox(p,R,sides); // 直方体の表示
      }
  }
}

int main()         /*** main関数 ***/
{
  srand(time(NULL)); // 乱数の初期化
  dmLoop(800, 600);  // シミュレーションループ ウインドウの幅,高
  return 0;
}

ホームワーク3

  1. step3-090619.zipをダウンロードして実行しよう!
  2. jキーを押すと右,fキーを押すと左にボックス全体が移動するようにしよう.
  3. forループのiが2, jが3の場合に表示されるボックスだけをキー操作で移動できるようにしよう.simLoop関数の中でif文を使う必要があります(やろうと思えばswitch文でもできますが.)
  4. ボックスを白色に変更し,乱数を使い1つのボックスだけ赤色に描画するプログラムを書こう.

コメントを残す

メールアドレスが公開されることはありません。