物理エンジンODEで学ぶC言語[Step2: Switch文]

step2

物理エンジン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文の方がすっきりした読みやすいプログラムを書けます。

では,演習をしながら落ち物系パズルゲームを作っていきましょう.

  • 演習

    1. step2-140626.zipをダウンロードし,実行してください.
    2. ブロックが壁から飛び出さないようにしましょう.
    3. ブロックが自動的に下に落ちるようにしましょう.
    4. ブロックが下の壁に到着したら、新しいブロックを登場させましょう.
    5. 新しいブロックが古いブロックを通り抜けないようにしましょう。

今回はここまで.

以上

コメントを残す

メールアドレスが公開されることはありません。