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