物理エンジン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次元配列を使うと楽できます.
今回はここまで.
以上

コメント