インベーダーモドキ(console_gameのソースとヘッダー。)

//-----------------------------------------------------------------------------
// console_game.h
// ヘッダーファイルはこっち。
//-----------------------------------------------------------------------------
#ifndef CONSOLE_GAME_LIB_H
//インクルードガード用定数。
#define CONSOLE_GAME_LIB_H
//-----------------------------------------------------------------------------
// デファイン。
//-----------------------------------------------------------------------------
//境界線。どちらかの座標がこの限界以上になると正常な描画が出来なくなる。
#define CONSOLE_W 120
#define CONSOLE_H 30
//-----------------------------------------------------------------------------
// 列挙体の宣言。
//-----------------------------------------------------------------------------
//各キーに割り当てられるビットを現す列挙体。
enum KEY_ALLOCATION_BITS {
KEY_LEFT = 1 << 0,
KEY_RIGHT = 1 << 1,
KEY_UP = 1 << 2,
KEY_DOWN = 1 << 3,
KEY_A = 1 << 4,
KEY_D = 1 << 5,
KEY_W = 1 << 6,
KEY_S = 1 << 7,
KEY_SPACE = 1 << 8,
};
//キーの入力状態を確かめる関数を参照するために必要な列挙体。
enum CHECK_INPUTSTATE
{
CHECK_INPUT_STATE_DOWN, //キーが押されているとき。
CHECK_INPUT_STATE_TRIGGER, //キーが押された瞬間。
CHECK_INPUT_STATE_RELEASE, //キーが離された瞬間。
CHECK_INPUT_STATE_MAX, //関数型ポインタ制御用の添え字。終端を現す。
};
//-----------------------------------------------------------------------------
// 構造体の宣言。
//-----------------------------------------------------------------------------
//KEY_STATE構造体。
struct KEY_STATE
{
int nowkey; //そのフレームでの入力状況。
int oldkey; //ひとつ前のフレームでの入力状況。
int trigger;//押した瞬間にのみアクティブになる入力情報。
int release;//離した瞬間にのみアクティブになる入力情報。
};
//キーの入力状態を確かめるための関数型ポインタ。
extern bool(CheckInputState[CHECK_INPUT_STATE_MAX])(KEY_ALLOCATION_BITS input_key);
/**ライブラリ使用の為の初期化関数。/
void InitConsoleIGameLibrary();
/** キーの入力状態を対応する変数に格納する関数。/
void SetInputKeyState();
/**画面のクリアを行う関数。/
void Clear();
/**渡された文字を指定された座標に表示する関数。

  • @param : X座標の位置。

  • @param : Y座標の位置。

  • @param : 表示する文字。整数値で一つまでならフォーマット指定子使用可能。

  • @param : 可変長引数。整数値を一つまで。
    /
    void Draw(float x, float y, const char character, ...);
    /**指定された時間処理を停止する関数。

  • @param : 止める時間。1000で一秒。
    */
    void Stop(int stop_time);
    #endif //CONSOLE_GAME_LIB_H


//-----------------------------------------------------------------------------
// console_game.cpp
// cppファイルはこっち。
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// インクルード。
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#include <stdarg.h>
#include "Console_game_lib.h"
//-----------------------------------------------------------------------------
// 関数のプロトタイプ宣言。(一覧用)
//-----------------------------------------------------------------------------
/**ライブラリ使用の為の初期化関数。*/
void InitConsoleIGameLibrary();
/**キーボードの入力状態を確認し、その状態を現すビットマスクを生成して返す関数。

  • @retval : 特定のキーが押されたかどうかを記録したビットマスク。
    /
    int CheckInputNowKey();
    /* ボタンが押されているかどうかを判別する関数。

  • @param : input_key チェックするボタン。

  • @retval : ボタンが押されている状態ならtrue、そうでないならfalse。
    /
    bool InputManagerKeyDown(KEY_ALLOCATION_BITS input_key);
    /* ボタンが押された瞬間かどうかを関数。

  • @param : input_key チェックするボタン。

  • @retval : ボタンが押された瞬間ならtrue、そうでないならfalse。
    /
    bool InputManagerKeyTrigger(KEY_ALLOCATION_BITS input_key);
    /* ボタンが離された瞬間かどうか判別する関数。

  • @param : input_key チェックするボタン。

  • @retval : ボタンが離された瞬間ならtrue、そうでないならfalse。
    /
    bool InputManagerKeyRelease(KEY_ALLOCATION_BITS input_key);
    /* キーの入力状態を対応する変数に格納する関数。/
    void SetInputKeyState();
    /**画面のクリアを行う関数。/
    void Clear();
    /**渡された文字を指定された座標に表示する関数。

  • @param : X座標の位置。

  • @param : Y座標の位置。

  • @param : 表示する文字。整数値で一つまでならフォーマット指定子使用可能。

  • @param : 可変長引数。整数値を一つまで。
    /
    void Draw(float x, float y, const char character, ...);
    /**後片付けをした後、アドベンチャーに遷移する関数。

  • @param : 止める時間。1000で一秒。
    */
    void Stop(int stop_time);
    //-----------------------------------------------------------------------------
    // グローバル変数。
    //-----------------------------------------------------------------------------
    //これはハンドル取得用。
    HANDLE hStdout;
    //キーの状態を保存するグローバル変数。
    KEY_STATE key_state = { 0 };
    /*関数ポインタは結局のところ実体を持った配列のようなものであるので、

  • グローバル変数の所に書いておくのが正しい気がする。なのでここに置く。
    */
    //キーの入力状態を確かめるための関数型ポインタ。
    bool(*CheckInputState[CHECK_INPUT_STATE_MAX])(KEY_ALLOCATION_BITS input_key)
    {
    InputManagerKeyDown,
    InputManagerKeyTrigger,
    InputManagerKeyRelease,
    };
    //-----------------------------------------------------------------------------
    // 関数の定義。
    //-----------------------------------------------------------------------------
    /**ライブラリ使用の為の初期化関数。
    */
    void InitConsoleIGameLibrary() {
    //操作するウィンドウのハンドルを取得。
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    }
    /**キーボードの入力状態を確認し、その状態を現すビットマスクを生成して返す関数。

  • @retval : 特定のキーが押されたかどうかを記録したビットマスク。
    /
    int CheckInputNowKey() {
    /
    ちょっとした呟き。本当はキーボードの入力情報全部をGetKeyboardState関数君で
    引っ張って来たいと思ってたんだけど、試してみても動かなかったんですね。
    ということでGetKeyState君に頑張ってもらうことにしました。
    /
    //入力情報記録用変数。環境にもやるけどint型は通常4バイトなので、最大32個のボタンの状態を記録出来る。それ以上欲しい場合は型を変えるべし。
    int bitflags = 0;
    //どのキーが押されているか調べていく。
    if (GetKeyState(VK_LEFT) & 0x8000) { bitflags |= KEY_LEFT; }
    if (GetKeyState(VK_RIGHT) & 0x8000) { bitflags |= KEY_RIGHT; }
    if (GetKeyState(VK_UP) & 0x8000) { bitflags |= KEY_UP; }
    if (GetKeyState(VK_DOWN) & 0x8000) { bitflags |= KEY_DOWN; }
    if (GetKeyState(0x41) & 0x8000) { bitflags |= KEY_A; }
    if (GetKeyState(0x44) & 0x8000) { bitflags |= KEY_D; }
    if (GetKeyState(0x57) & 0x8000) { bitflags |= KEY_W; }
    if (GetKeyState(0x53) & 0x8000) { bitflags |= KEY_S; }
    if (GetKeyState(VK_SPACE) & 0x8000) { bitflags |= KEY_SPACE; }
    //入力情報を返す。
    return bitflags;
    }
    /* ボタンが押されているかどうかを判別する関数。

  • @param : input_key チェックするボタン。

  • @retval : ボタンが押されている状態ならtrue、そうでないならfalse。
    /
    bool InputManagerKeyDown(KEY_ALLOCATION_BITS input_key) {
    return key_state.nowkey & input_key;
    }
    /* ボタンが押された瞬間かどうかを関数。

  • @param : input_key チェックするボタン。

  • @retval : ボタンが押された瞬間ならtrue、そうでないならfalse。
    /
    bool InputManagerKeyTrigger(KEY_ALLOCATION_BITS input_key) {
    return key_state.trigger & input_key;
    }
    /* ボタンが離された瞬間かどうか判別する関数。

  • @param : input_key チェックするボタン。

  • @retval : ボタンが離された瞬間ならtrue、そうでないならfalse。
    */
    bool InputManagerKeyRelease(KEY_ALLOCATION_BITS input_key) {
    return key_state.release & input_key;
    }
    //キーの入力状態を対応する変数に格納する関数。
    void SetInputKeyState() {
    key_state.oldkey = key_state.nowkey;
    key_state.nowkey = CheckInputNowKey();
    key_state.trigger = key_state.nowkey ^ key_state.oldkey & key_state.nowkey;
    key_state.release = key_state.oldkey ^ key_state.nowkey & key_state.oldkey;
    }
    /**画面のクリアを行う関数。
    */
    void Clear() {
    DWORD dwWritten;
    //書き始めの位置を決定。
    COORD position = { 0, 0 };
    //画面全体をスペースで産める。
    FillConsoleOutputCharacter(hStdout,' ',CONSOLE_W * CONSOLE_H,position, &dwWritten);
    }
    /**渡された文字を指定された座標に表示する関数。

  • @param : X座標の位置。

  • @param : Y座標の位置。

  • @param : 表示する文字。整数値で一つまでならフォーマット指定子使用可能。

  • @param : 可変長引数。整数値を一つまで。
    /
    void Draw(float x, float y, const char character, ...) {
    //可変長引数ロード用。
    va_list args;
    va_start(args, character);
    //表示範囲内かチェック。そうであれば描画する。
    if ((0 <= x) && (x < CONSOLE_W) && (0 <= y) && (y < CONSOLE_H)) {
    COORD position = { x, y };
    //操作するウィンドウと書き始めの座標を決める。
    SetConsoleCursorPosition(hStdout, position);
    //描画する。
    printf(character, va_arg(args, int));
    }
    va_end(args);
    }

/**指定された時間処理を停止する関数。

  • @param : 止める時間。1000で一秒。
    */
    void Stop(int stop_time) {
    //本当はこれあんまりよくない。まあでも都合が良いのでこれを使う。
    Sleep(stop_time);
    }

この記事が気に入ったらサポートをしてみませんか?