Chapter 06. キーボードを使おう

このチュートリアルは、キーボードのコールバック関数を導入を解説します。キーボードを使って、「a」キーを押した時の処理や、 「d」キーを押した時の処理、と言った具合にキーボードを押した時の実行されるプログラムを書くことができます。

1. 準備

サンプルファイル

Chapter 06 で使用するサンプルファイルをご用意致しましたので、ダウンロードして下さい。 Excel ファイルを開きます。開く際に警告が表示された場合は、マクロを有効にする、を選択して下さい。もし、マクロを無効に してしまった場合は、Excel ファイルを一旦閉じ、もう一度開いて今度はマクロを有効にする、を選択して下さい。


2. コールバック関数の登録

キーボードのキーが押された時に実行する関数を用意します。 この関数は、関数名は任意ですが、引数は以下に載せたもので固定です。 今回は、関数名を key としました。

/**
 * c (unsigned char) 押されたキーボードのキー
 * x (int) キーを押した時のマウスの位置X座標
 * y (int) キーを押した時のマウスの位置Y座標
 */
void key(unsigned char c, int x, int y) {
}

キーの「x」、「y」、「z」を押した時の処理は、以下のように書きます。他のキーの場合も同様です。

void key(unsigned char c, int x, int y) {
    if (c == 'x') {
        // x キーを押した時の処理
    } else if (c == 'y') {
        // y キーを押した時の処理
    } else if (c == 'z') {
        // z キーを押した時の処理
    }
}

関数を key をコールバック関数に登録します。登録するためには、SGKeyBoard() 関数の引数に関数名を指定すると思ってください。 今回、関数名は key なので以下のようにして登録します。SGKeyBoard() 関数は main() 関数の中に書きます。

SGKeyBoard(key);

では、Chapter 01で作った雛形に「2. キーボードのコールバック関数を登録しよう」で作成したコードを 追加します。

#include "sfcglx.h"

void display() {   
    BGColor(200, 200, 200);  // 背景の色
    SGBeginEdit();           // 形状の描画の開始.   
    SGEndEdit();             // 形状の描画の終了.   
    SGSwapFrames();          // フレームを入れ替える. 
}

void key(unsigned char c, int x, int y) {
    if (c == 'x') {
        // x キーを押した時の処理
        printf("x キー\n");
    } else if (c == 'y') {
        // y キーを押した時の処理
        printf("y キー\n");
    } else if (c == 'z') {
        // z キーを押した時の処理
        printf("z キー\n");
    }
}

int main(int argc, char** argv) {
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\Users\\Akito\\Documents\\MediaDesign3D\\6");

    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGKeyBoard(key); // キーボード
    SGCallBack(); // コールバック関数を登録
    return 0; 
}

3. キーを押された時の処理

ここでは、x キーを押した時に、変数 x_value (int 型) が 1 つ増えるようにします。 同様に y キーの場合は、変数 y_value (int 型) が 1 つ増えるようにします。 z キーの場合は、変数 z_value (int 型) が 1 つ増えるようにします。 x_value、y_value、z_value を宣言・定義しましょう。それぞれ 0 で初期化します。

int x_value = 0; // x キーを押した時に、+ 1
int y_value = 0; // y キーを押した時に、+ 1
int z_value = 0; // z キーを押した時に、+ 1

では、key 関数の所定の位置に、それぞれのキーが押された時に値を + 1 するようなコードを加えます。

void key(unsigned char c, int x, int y) {
    if (c == 'x') {
        // x キーを押した時の処理
        x_value++;
    } else if (c == 'y') {
        // y キーを押した時の処理
        y_value++;
    } else if (c == 'z') {
        // z キーを押した時の処理
        z_value++;
    }
}

さらに、x キーを押した時に、x_value の値をセルに入力するようにします。セルへの入力は、SGLXInput() 関数を使用します。同様に、y キーを押した時に y_value を、z キーを押した時に z_value を入力するようにしてみましょう。 入力するセルの座標は任意です。ここでは、x_value の値を AC2 、y_value の値を AD2 、z_value の値を AE2 に入力します。 SGLXInput()関数、並びにChapter 04を参照して下さい。 では、SGLXInput()関数を使った、セルへの入力の部分を加えます。

void key(unsigned char c, int x, int y) {
    if (c == 'x') {
        x_value++;
        SGLXInput(x_value, "AC2");
        // SGLXInput(x_value, Cell("AC", 2); でも OK
    } else if (c == 'y') {
        y_value++;
        SGLXInput(y_value, "AD2");
        // SGLXInput(x_value, Cell("AD", 2); でも OK
    } else if (c == 'z') {
        z_value++;
        SGLXInput(z_value, "AE2");
        // SGLXInput(x_value, Cell("AE", 2); でも OK
    } 
}

以下のような書き方も出来ます

void key(unsigned char c, int x, int y) {
    switch (c) {
        case 'x': SGLXInput(++x_value, "AC2"); break;
        case 'y': SGLXInput(++y_value, "AD2"); break;
        case 'z': SGLXInput(++z_value, "AE2"); break;
    }
}

では、ここまでのソースコードを全部載せます。

// Chapter 06. キーボードを使おう
#include "sfcglx.h"

int x_value = 0; // x キーを押した時に、+ 1
int y_value = 0; // y キーを押した時に、+ 1
int z_value = 0; // z キーを押した時に、+ 1


void display() {   
    BGColor(200, 200, 200);  // 背景の色
    SGBeginEdit();           // 形状の描画の開始.   
    SGEndEdit();             // 形状の描画の終了.   
    SGSwapFrames();          // フレームを入れ替える. 
}

void key(unsigned char c, int x, int y) {
    if (c == 'x') {
        x_value++;
        SGLXInput(x_value, "AC2");
    } else if (c == 'y') {
        y_value++;
        SGLXInput(y_value, "AD2");
    } else if (c == 'z') {
        z_value++;
        SGLXInput(z_value, "AE2");
    } 
}

int main(int argc, char** argv) {
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\6");

    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGKeyBoard(key); // キーボード

    SGCallBack(); // コールバック関数を登録
    return 0; 
}

プログラムを保存、コンパイル、実行してみてください。x キー、y キー、z キーを押してみましょう。 セルに値が入力されていくと思います。

4. グラフにしてみよう

では、AC2、AD2、AE2 の値を参照したグラフを作成してみましょう。 AC2、AD2、AE2 をマウスでドラッグします。挿入 -> グラフ から、自由にグラフを選択してください。 複数グラフを作っても構いません。私は、3Dの棒グラフを作りました。

3Dグラフを作りました

一旦、グラフを作ったら、もう一度プログラムを保存、コンパイル、実行し、x キー、y キー、z キーを押してみましょう。 キーボードを押すたびに、棒グラフが変わっていくと思います。

Chapter 06 は以上です。お疲れ様でした。