物理エンジン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文の方がすっきりした読みやすいプログラムを書けます。
では,演習をしながらシューティングゲームを作っていきましょう.
- 演習
 - step2-150625.tgzをダウンロードし,実行してください。
- ロボットの形や色を自分な好きに変えよう。
- 弾の発射速度を変更しよう。
- ロボットを左右にキーで動かしても、弾は移動しません。ロボットと弾を同時に動かすように変更しよう。
- 弾が1発しか発射できません。100発打てるようにロボットをバージョンアップしよう。
 
今回はここまで.
以上
 
  
  
  
  
コメント