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

step2

物理エンジンODEを使い,ゲームを作りながらC言語をマスターすることを目指して連載します。ODEのバージョンは0.13に対応しています。シューティングゲームの2回目です.

今回はswtich文を使ったキーボードによる戦闘機の移動と標的を表示します.

該当するソースコードは次のとおりです.

/* step2 */
/* step2 switch文とキー処理関数 */
#include "dm2.h"
#include <time.h>
#include <stdlib.h>

int fire = 0; // 発射
double start_x = 0.0, start_y = 0.5, start_z = 0.5; // 初期位置
double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 回転行列が格納される配列, 位置(x,y,z)[m]
double target[3] = {0.0, 0.0, 0.5};   // 位置(x,y,z)[m]
double robot[3]  = {start_x, start_y, start_z}; // ロボットの位置
double bullet[3] = {start_x, start_y, start_z}; // 弾の位置;
double sides[3] = {1.0, 0.5, 1.0}; // 直方体のサイズ(x, y, z)[m]

void command(int cmd) {
    switch (cmd) {
    case 'a':
        robot[0] -= 1.0;
        if (fire == 0) bullet[0] -= 1.0;
        break;
    case 'd':
        robot[0] += 1.0;
        if (fire == 0) bullet[0] += 1.0;
        break;
    case 'x':
        robot[1] -= 1.0;
        break;
    case 'w':
        robot[1] += 1.0;
        break;
    case 32:
        fire = 1;
        break;
    default:
        printf("Input %c (%d)\n",(char)cmd, cmd);
    }
}

void drawTarget() {
    int i, j, num =10;
    for (i = 0; i < num; i++) {
        dsSetColor(1.0, 0.0, 0.0); // 色の設定
        target[0] = 2 * i  + start_x - num + 1;       // 位置のx成分
        target[1] = start_y + 10;       // 位置のx成分
        target[2] = 0.5;                 // 位置のz成分
        dsDrawBox(target,R,sides); // 直方体の表示
    }
}

void drawBullet() {
    dsSetColor(0.0, 0.0, 1.0); // 色の設定
    dsDrawSphere(bullet,R,0.1); // 直方体の表示
}

void simLoop(int pause) {      /***  シミュレーションループ ***/
    // ロボットの表示
    dsSetColor(1.0, 1.0, 0.0);   // 黄色
    dsDrawSphere(robot, R, 0.5);

    if (fire) bullet[1] += 0.01;
    drawBullet();  // 弾の表示
    drawTarget();  // 標的の表示
}

int main() {       /*** main関数 ***/
    robot[1] = bullet[1] = start_y - 10;
    dmLoop(800, 600, simLoop, command); // シミュレーションループ ウインドウの幅,高
    return 0;
}

ここではswitch文を使ったキー処理の方法を学びます.キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力により弾丸を発射したり,車を操縦しますね.switch文を使って,キーボードからのキー入力を処理する方法を学びます.

switch文とキー処理
新しく登場したのが15行目のcommand関数です.これは,キーボードからのキー入力を引数cmdとして受け取ります.このサンプルプログラムではswitch文を使いキー入力の値に応じて分岐させ違う処理をさせています.aまたはdが入力されるとロボットを表す黄色の球を左または右へ1[m]移動します.wまたはxならロボットを上または下へ1[m]移動させます.

その他のキーを入力するとdefaultにあるprintf文でcmdで入力された文字を表示します. なお、switch文の代わりにif文でもできますが、キー入力が増え分岐が多くなるとswitch文の方がすっきりした読みやすいプログラムを書けます。

では,演習をしながらシューティングゲームを作っていきましょう.

  • 演習

    1. step2-150625.tgzをダウンロードし,実行してください。
    2. ロボットの形や色を自分な好きに変えよう。
    3. 弾の発射速度を変更しよう。
    4. ロボットを左右にキーで動かしても、弾は移動しません。ロボットと弾を同時に動かすように変更しよう。
    5. 弾が1発しか発射できません。100発打てるようにロボットをバージョンアップしよう。

今回はここまで.

以上

コメントを残す

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