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つのボックスだけ赤色に描画するプログラムを書こう.
コメント