MGL::Input::Gamepad#

概要#

MGL::Input::Gamepadはゲームパッドの入力を取得するためのクラスです。

宣言#

namespace MGL::Input
{
    class Gamepad;
}

メンバ情報#

種類

名前

内容

関数

コンストラクタ

関数

IsEnabled

取得したゲームパッドが有効かを取得

関数

operator bool()

bool型にキャストした際に有効状態を取得

関数

operator!()

有効状態を否定演算子で取得

関数

GetType

ゲームパッドの種類を取得

関数

GetName

ゲームパッドの名前を取得

関数

Entry

ゲームパッドのエントリー

関数

Leave

ゲームパッドのエントリー解除

関数

GetEntry

ゲームパッドからエントリー番号を取得

関数

GetEntryNumber

ゲームパッドのエントリー番号を数値で取得

関数

IsEntried

ゲームパッドがエントリーされているかを取得

関数

IsPressing

ボタンの押下状態を取得

関数

IsPressingAny

指定されたいずれかのボタンが押されているかを取得

関数

IsTriggered

ボタンが押された瞬間を取得

関数

IsReleased

ボタンが離された瞬間を取得

関数

IsARepeat

ボタンのリピート入力を取得

関数

GetLeftStick

左スティックの状態を取得

関数

GetRightStick

右スティックの状態を取得


コンストラクタ#

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        Gamepad(PadEntry entry = PadEntry::Auto) noexcept;
    };
}

引数#

MGL::Input::PadEntry entry

取得するゲームパッドのエントリー番号。省略時はAuto

説明#

引数で指定したエントリー番号に対応したゲームパッドを取得して初期化します。取得に失敗した場合は無効なオブジェクトとなり、IsEnabledfalseを返します。

引数に指定できるエントリー番号と特殊な指定は次の通りです。

Player1〜Player8

対応したエントリー番号のゲームパッドで初期化します。指定された番号でエントリーされていない場合は無効なオブジェクトとなります。

NoEntry

エントリーされていないゲームパッドのうち、入力のあるいずれかのゲームパッドで初期化します。条件に合うゲームパッドが存在しない場合は無効なオブジェクトとなります。

Any

エントリー状態に関わらず、入力のあるいずれかのゲームパッドで初期化します。条件に合うゲームパッドが存在しない場合は無効なオブジェクトとなります。

Auto

エントリーされているゲームパッドのうち、割り振られた番号が最も小さいゲームパッドで初期化します。エントリーされているゲームパッドが存在しない場合はNoEntryとして扱われます。

引数を省略した場合はAutoが指定されます。

ゲームパッドのエントリーについてはゲームパッドのエントリーを参照してください。

利用例#

// プレイヤー1のゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Player1);

if (!gamepad)
{
    // プレイヤー1がエントリーされていない場合はここに到達
}

関連#


IsEnabled#

取得したゲームパッドが有効かを取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool IsEnabled() const noexcept;
    };
}

戻り値#

bool

ゲームパッドが有効であればtrue、無効であればfalse

説明#

ゲームパッドが有効であるかを取得します。コンストラクタで有効なゲームパッドが取得できなかった場合、この関数がfalseを返します。

この関数はoperator bool()またはoperator!()で代替可能です。

利用例#

// プレイヤー1のゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Player1);

if (!gamepad.IsEnabled())
{
    // プレイヤー1がエントリーされていない場合はここに到達
}

関連#


operator bool()#

bool型にキャストした際に有効状態を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        explicit constexpr operator bool() const noexcept;
    };
}

戻り値#

bool

ゲームパッドが有効であればtrue、無効であればfalse

説明#

ゲームパッドが有効であるかを取得します。コンストラクタで有効なゲームパッドが取得できなかった場合、この関数がfalseを返します。

この関数の戻り値はIsEnabledと等価です。

利用例#

// プレイヤー1のゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Player1);

if (gamepad)
{
    // プレイヤー1がエントリーされていればここに到達する
}

関連#


operator!()#

有効状態を否定演算子で取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool operator!() const noexcept;
    };
}

戻り値#

bool

ゲームパッドが無効であればtrue、有効であればfalse

説明#

ゲームパッドが有効であるかを否定演算子で判別します。コンストラクタで有効なゲームパッドが取得できなかった場合、この関数がtrueを返します。

この関数の戻り値はIsEnabledおよびoperator bool()の逆の結果を返します。

利用例#

// プレイヤー1のゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Player1);

if (!gamepad)
{
    // プレイヤー1がエントリーされていない場合はここに到達
}

GetType#

ゲームパッドの種類を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr PadType GetType() const noexcept;
    };
}

戻り値#

MGL::Input::PadType

このゲームパッドの種類を表す値

説明#

ゲームパッドの種類を取得します。

この関数の戻り値は、同じ製品のゲームパッドでも実行環境によって異なる場合があります。詳細はゲームパッドの認識タイプを参照してください。

無効なオブジェクトに対してこの関数を呼び出した場合、戻り値はPadType::Disableになります。

利用例#

// 入力のあるいずれかのゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);

// 取得できたゲームパッドが DualShock4 かをチェック
if (gamepad)
{
    if (gamepad.GetType() == MGL::Input::PadType::DualShock4)
    {
        MGL_TRACE("DualShock4のボタンが押された");
    }
}

関連#


GetName#

ゲームパッドの名前を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        const char *GetName() const noexcept;
    };
}

戻り値#

const char *

ゲームパッドの名前

説明#

ゲームパッドの名前を取得します。

この関数が返す名前は、同じ製品でも環境や認識方法によって異なる場合があります。例として、標準構成においてGetTypeの結果がGenericHIDDirectInputの場合はデバイスが持つプロダクト名を返しますが、XInputの場合は製品に関わらず"Generic XInput Gamepad"で統一されます。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は空の文字列になります。

利用例#

// ボタン01が押されたゲームパッドの名前を表示
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);
if (gamepad.IsTriggered(MGL::Input::PadButton::Button01))
{
    MGL_TRACE(gamepad.GetName());
}

Entry#

ゲームパッドのエントリー

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        PadEntry Entry(PadEntry entry = PadEntry::Auto) noexcept;
    };
}

引数#

MGL::Input::PadEntry entry

エントリーする番号。省略時はAuto

戻り値#

MGL::Input::PadEntry

エントリーした番号。失敗時はNoEntry

説明#

ゲームパッドのエントリー処理を行います。

引数を省略またはAutoを指定した場合、未使用のエントリー番号を検索して割り当てます。Player1Player8のエントリー番号を直接指定した場合、その番号を割り当てます。

指定したエントリー番号が既に他のゲームパッドに割り当てられている場合、そのゲームパッドのエントリーは解除されます。また、既にエントリー済みのゲームパッドに対してこの関数を呼び出した場合、現在のエントリーを一旦解除して新たなエントリー番号を割り当てます。

無効なゲームパッドをエントリーした場合は失敗となり、NoEntryが返ります。

利用例#

// エントリーされていないゲームパッドのうち、入力のあるものを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::NoEntry);

// 取得できていたらそのゲームパッドをエントリー
if (gamepad)
{
    if (gamepad.Entry() != MGL::Input::PadEntry::NoEntry)
    {
        MGL_TRACE("エントリー完了: %s: Player %d", gamepad.GetName(), gamepad.GetEntryNumber());
    }
}

関連#


Leave#

ゲームパッドのエントリー解除

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        void Leave() noexcept;
    };
}

説明#

ゲームパッドのエントリーを解除し、NoEntryの状態に戻します。

未エントリーのゲームパッドに対してこの関数を呼び出した場合は何もしません。

利用例#

// プレイヤー1のゲームパッドのエントリーを解除
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Player1);
if (gamepad)        // この条件式は省略可能
{
    gamepad.Leave();
}

関連#


GetEntry#

ゲームパッドからエントリー番号を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr PadEntry GetEntry() const noexcept;
    };
}

戻り値#

MGL::Input::PadEntry

現在のエントリー番号

現在のエントリー番号を取得します。

エントリーされていないゲームパッドや無効なゲームパッドから取得した場合はNoEntryが返ります。

利用例#

// ボタン01が押されたゲームパッドが Player1 であるかを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);
if (gamepad.IsTriggered(MGL::Input::PadButton::Button01))
{
    if (gamepad.GetEntry() == MGL::Input::PadEntry::Player1)
    {
        MGL_TRACE("ボタン01を押したのはプレイヤー1");
    }
}

関連#


GetEntryNumber#

ゲームパッドのエントリー番号を数値で取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr uint8_t GetEntryNumber() const noexcept;
    };
}

戻り値#

uint8_t

18のエントリー番号。未エントリーの場合は0

説明#

エントリー番号を数値で取得します。

エントリーされていないゲームパッドや無効なゲームパッドから取得した場合は0が返ります。

利用例#

// ボタン01が押されたゲームパッドのエントリー番号を取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);
if (gamepad.IsTriggered(MGL::Input::PadButton::Button01))
{
    MGL_TRACE("ボタン01を押したのはプレイヤー%d", gamepad.GetEntryNumber());
}

関連#


IsEntried#

ゲームパッドがエントリーされているかを取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool IsEntried() const noexcept;
    };
}

戻り値#

bool

エントリーされている場合はtrue、されていない場合はfalse

説明#

ゲームパッドがエントリーされているかどうかを取得します。

無効なゲームパッドから取得した場合はfalseが返ります。

利用例#

// ボタン01を押したゲームパッドのエントリー状態を取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);
if (gamepad.IsTriggered(MGL::Input::PadButton::Button01))
{
    if (gamepad.IsEntried())
    {
        MGL_TRACE("ボタン01を押したゲームパッドはエントリー済み");
    }
    else
    {
        MGL_TRACE("ボタン01を押したゲームパッドは未エントリー");
    }
}

関連#


IsPressing#

ボタンの押下状態を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        // (1) ボタンの押下状態を取得
        constexpr bool IsPressing(PadButton button) const noexcept;

        // (2) 複数ボタンの押下状態を取得
        constexpr bool IsPressing(PadButtonFlags buttonFlags) const noexcept;
    };
}

引数#

(1) ボタンの押下状態を取得
MGL::Input::PadButton button

取得するボタンの種類

(2) 複数ボタンの押下状態を取得
MGL::Input::PadButtonFlags buttonFlags

取得するボタンのビットフラグ

戻り値#

bool

指定されたボタンが押されていればtrue、押されていなければfalse

説明#

ゲームパッドのボタンの押下状態を取得します。

(1) は1つのボタンの判定に使用します。 (2) は2つ以上のボタンの組み合わせを同時に判定する場合に使用します。

ビットフラグによるボタンの組み合わせはPadButton|(or)演算子を使用することでPadButtonFlagsへと変換可能です。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常にfalseとなります。

利用例#

// 入力のあるいずれかのゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);

// ボタン01の押下状態をチェック
if (gamepad.IsPressing(MGL::Input::PadButton::Button01))
{
    MGL_TRACE("ボタン01が押されている");
}

// L1ボタンとR1ボタンの同時押しをチェック
if (gamepad.IsPressing(MGL::Input::PadButton::L1 | MGL::Input::PadButton::R1))
{
    MGL_TRACE("L1ボタンとR1ボタンが同時に押されている");
}

関連#


IsPressingAny#

指定されたいずれかのボタンが押されているかを取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool IsPressingAny(PadButtonFlags buttonFlags = kGamepadButtonAll) const noexcept;
    };
}

引数#

MGL::Input::PadButtonFlags buttonFlags

取得するボタンのビットフラグ。省略時は全てのボタン

戻り値#

bool

指定されたボタンのいずれかが押されていればtrue、どれも押されていなければfalse

説明#

引数で指定したボタンのいずれかが押されているかを取得します。引数を省略した場合は全てのボタンを対象にして取得します。

ビットフラグによるボタンの組み合わせはPadButton|(or)演算子を使用することでPadButtonFlagsへと変換可能です。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常にfalseとなります。

利用例#

// 入力のあるいずれかのゲームパッドを取得
MGL::Input::Gamepad gamepad(MGL::Input::PadEntry::Any);

// L1ボタンかR1ボタンのどちらかが押されているかをチェック
if (gamepad.IsPressingAny(MGL::Input::PadButton::L1 | MGL::Input::PadButton::R1))
{
    MGL_TRACE("L1ボタンかR1ボタンのどちらかが押されている");
}

関連#


IsTriggered#

ボタンが押された瞬間を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool IsTriggered(PadButton button) const noexcept;
    };
}

引数#

MGL::Input::PadButton button

取得するボタンの種類

戻り値#

bool

押された瞬間であればtrue、それ以外はfalse

説明#

ボタンを認識した最初のフレームだけtrueを返します。具体的には、指定されたボタンがそのフレームで入力されていて、前回のフレームでは入力されていない場合にtrueとなります。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常にfalseとなります。

利用例#

MGL::Input::Gamepad gamepad;

if (gamepad.IsTriggered(MGL::Input::PadButton::Button01))
{
    MGL_TRACE("ボタン01が押された");
}

関連#


IsReleased#

ボタンが離された瞬間を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool IsReleased(PadButton button) const noexcept;
    };
}

引数#

MGL::Input::PadButton button

取得するボタンの種類

戻り値#

bool

押された瞬間であればtrue、それ以外はfalse

説明#

ボタンが離された最初のフレームだけtrueを返します。具体的には、指定されたボタンがそのフレームで入力されておらず、前回のフレームでは入力されていた場合にtrueとなります。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常にfalseとなります。

利用例#

MGL::Input::Gamepad gamepad;

if (gamepad.IsReleased(MGL::Input::PadButton::Button01))
{
    MGL_TRACE("ボタン01が離された");
}

関連#


IsARepeat#

ボタンのリピート入力を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr bool IsARepeat(PadButton button) const noexcept;
    };
}

引数#

MGL::Input::PadButton button

取得するボタンの種類

戻り値#

bool

指定されたボタンが押されている間、設定されている間隔でtruefalseを繰り返す

説明#

指定されたボタンのリピート入力を取得します。この関数がtrueを返す間隔はMGL::Input::GamepadSettings::SetRepeatSettingで設定可能です。

リピート入力の詳しい挙動についてはリピート間隔の変更を参照してください。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常にfalseとなります。

利用例#

MGL::Input::Gamepad gamepad;

if (gamepad.IsARepeat(MGL::Input::PadButton::Button01))
{
    MGL_TRACE("ボタン01のリピート入力");
}

関連#


GetLeftStick#

左スティックの状態を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr const Vector2 &GetLeftStick() const noexcept;
    };
}

戻り値#

MGL::Vector2

左スティックの状態

説明#

左側のサムスティックの状態を取得します。

値はxが水平方向を、yが垂直方向をそれぞれ1.0から-1.0の範囲で表します。

../_images/thumbstick.svg

注釈

GetTypeの戻り値がDirectInputまたはGenericHIDの場合、デバイスによっては座標系が異なる場合があります。

左サムスティックの入力状態は、ボタンのAnalogUpAnalogDownAnalogLeftAnalogRightへと変換されます。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常に(0.0f, 0.0f)となります。

利用例#

MGL::Input::Gamepad gamepad;

if (gamepad)
{
    auto leftStickValue = gamepad.GetLeftStick();
    MGL_TRACE("左スティックの状態: %f, %f", leftStickValue.x, leftStickValue.y);
}

関連#


GetRightStick#

右スティックの状態を取得

宣言#

namespace MGL::Input
{
    class Gamepad
    {
    public:
        constexpr const Vector2 &GetRightStick() const noexcept;
    };
}

戻り値#

MGL::Vector2

右スティックの状態

説明#

右側のサムスティックの状態を取得します。

値はxが水平方向を、yが垂直方向をそれぞれ1.0から-1.0の範囲で表します。

../_images/thumbstick.svg

注釈

GetTypeの戻り値がDirectInputまたはGenericHIDの場合、デバイスによっては座標系が異なる場合があります。

無効なゲームパッドに対してこの関数を呼び出した場合、戻り値は常に(0.0f, 0.0f)となります。

利用例#

// NOTE: このコードは他のボタンを押しながらでないとトレースを出力しない

MGL::Input::Gamepad gamepad;

if (gamepad)
{
    auto rightStickValue = gamepad.GetRightStick();
    MGL_TRACE("右スティックの状態: %f, %f", rightStickValue.x, rightStickValue.y);

}

関連#