物理エンジンODEを使い,ゲームを作りながらC言語をマスターすることを目指して連載します。ODEのバージョンは0.13に対応しています。落ち物系パズルゲームの2回目です.
今回はswtich文を使ったブロックのキーボードによる移動,壁を表示します.
該当するソースコードは次のとおりです.
/* step2 */
#include "dm2.h"
#include <time.h>
#include <stdlib.h>
double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 回転行列が格納される配列, 位置(x,y,z)[m]
double wall_p[3] = {0.0, 0.0, 0.5}; // 位置(x,y,z)[m]
double block[100][3] ; // ブロックの位置
double sides[3] = {1.0, 1.0, 1.0}; // 直方体のサイズ(x, y, z)[m]
double start_x = 0.0, start_y = 0.5, start_z = 0.0; // 初期位置
int now = 0; // 現在、操作可能なブロック番号
void command(int cmd)
{
float xyz;
unsigned char key;
switch (cmd)
{
case 'a':
block[now][0] -= 1.0;
break;
case 'd':
block[now][0] += 1.0;
break;
case 'x':
block[now][1] -= 1.0;
break;
case 'w':
block[now][1] += 1.0;
break;
case 32: // blank
block[now][1] = -8.5;
break;
default:
printf("Input %c (%d)\n",(char)cmd, 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 - num/2.0; // 位置のx成分
wall_p[1] = j + start_y - num/2.0; // 位置のx成分
wall_p[2] = 0.5; // 位置のz成分
dsDrawBox(wall_p,R,sides); // 直方体の表示
}
}
}
}
void simLoop(int pause) /*** シミュレーションループ ***/
{
int i;
float red = 1.0, green = 0.0, blue = 0.0; // 赤,緑,青成分
static int dir =1;
// ブロックの表示
dsSetColor(1.0, 1.0, 0.0); // 黄色
for (i=0; i < now + 1;i++) {
dsDrawSphere(block[i], R, 0.5);
}
// 壁の表示
drawWall();
}
int main() /*** main関数 ***/
{
int i;
block[0][0] = 0.5;
block[0][1] = 7.5;
block[0][2] = 0.5;
srand(time(NULL)); // 乱数の初期化
dmLoop(800, 600, simLoop, command); // シミュレーションループ ウインドウの幅,高
return 0;
}
ここではswitch文を使ったキー処理の方法を学びます.キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり,車を操縦しますね.switch文を使って,キーボードからのキー入力を処理する方法を学びます.
switch文とキー処理
新しく登場したのが12行目のcommand関数です.これは,キーボードからのキー入力を引数cmdとして受け取ります.このサンプルプログラムではswitch文を使いキー入力の値に応じて分岐させ違う処理をさせています.aまたはdが入力されるとブロックを表す黄色の球を左または右へ1[m]移動します.wまたはxならブロックを上または下へ1[m]移動させます.
その他のキーを入力するとdefaultにあるprintf文でcmdで入力された文字を表示します. なお、switch文の代わりにif文でもできますが、キー入力が増え分岐が多くなるとswitch文の方がすっきりした読みやすいプログラムを書けます。
では,演習をしながら落ち物系パズルゲームを作っていきましょう.
- 演習
- step2-140626.zipをダウンロードし,実行してください.
- ブロックが壁から飛び出さないようにしましょう.
- ブロックが自動的に下に落ちるようにしましょう.
- ブロックが下の壁に到着したら、新しいブロックを登場させましょう.
- 新しいブロックが古いブロックを通り抜けないようにしましょう。
今回はここまで.
以上

コメント