物理エンジンODEを使い,ゲームを作りながらC言語をマスターすることを目指して連載します。ODEのバージョンは0.12に対応しています。パックマン風ゲームの2回目です.
今回はswtich文を使ったロボット(球)のキーボードによる移動,おばけ(カプセル)の自動移動,壁を表示します.
該当するソースコードは次のとおりです.
/* step2 */ #include "dm2.h" void command(int cmd) { float xyz; unsigned char key; switch (cmd) { case 'a': robot_p[0] -= 1.0; break; case 'd': robot_p[0] += 1.0; break; case 'x': robot_p[1] -= 1.0; break; case 'w': robot_p[1] += 1.0; break; default: printf("Input %c\n",(char) cmd); } } void drawWall() { int i, j, num =20; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { if ((i==0) || (i==num-1) || (j==0) || (j==num-1)) { dsSetColor(1.0, 0.0, 0.0); // 色の設定 wall_p[0] = i + start_x; // 位置のx成分 wall_p[1] = j + start_y; // 位置のx成分 wall_p[2] = 0.5; // 位置のz成分 dsDrawBox(wall_p,R,sides); // 直方体の表示 } } } } void simLoop(int pause) /*** シミュレーションループ ***/ { float red = 1.0, green = 0.0, blue = 0.0; // 赤,緑,青成分 static int dir =1; // ロボットの表示 dsSetColor(1.0, 1.0, 0.0); // 黄色 dsDrawSphere(robot_p,R, 0.5); // おばけの表示 dsSetColor(0.1, 0.1, 0.1); // 黒 dsDrawCapsule(obake1_p, R, 0.5, 0.5); if ((obake1_p[0] > 7.5) || (obake1_p[0] < -9.5)) dir *= -1; obake1_p[0] += dir * 0.01; // 壁の表示 drawWall(); }
ここではswitch文を使ったキー処理の方法を学びます.キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり,車を操縦しますね.switch文を使って,キーボードからのキー入力を処理する方法を学びます.
switch文とキー処理
新しく登場したのが3行目のcommand関数です.これは,キーボードからのキー入力を引数cmdとして受け取ります.このサンプルプログラムではswitch文を使いキー入力の値に応じて分岐させ違う処理をさせています.aまたはdが入力されるとロボットを表す黄色の球を左または右へ1[m]移動します.wまたはxならロボットを上または下へ1[m]移動させます.
その他のキーを入力するとdefaultにあるprintf文でcmdで入力された文字を表示します. なお、switch文の代わりにif文でもできますが、キー入力が増え分岐が多くなるとswitch文の方がすっきりした読みやすいプログラムを書けます。
おばけの移動
次におばけを表す黒いカプセルの動きを説明します.58,59行目でおばけの動きを制御しています.ここでは簡単に左右に動くだけの処理です.
では,演習をしながらパックマン風のゲームを作っていきましょう.
- 演習
- step2-130701.zipをダウンロードし,実行してください.
- おばけの移動量を大きくし,壁に衝突したら反対向きに動くように変更しましょう.
- おばけを2体(赤,緑)を追加して,上と同様にうごかしましょう.
- サンプルプログラムでは外側の壁だけでしたが,これをパックマンを参考に内部にも壁のある迷路を作りましょう.
- 迷路を表すのに2次元配列を使うと楽できます.
今回はここまで.
以上
コメント