TOP > プログラミング関連 > SFML非公式翻訳トップ > 【非公式翻訳】SFML2.4チュートリアル > ウィンドウモジュール > キーボード、マウス、ゲームパッド

[原文(公式)]

◆◆ キーボード、マウス、ゲームパッド ◆◆
SFML2.4 非公式日本語翻訳
ここは、キーボードやマウスやパッド自体の入力状態をリアルタイムに取得する方法について、のページです。 ウィンドウイベントと間違えないでね。

ウィンドウイベントは、何かが起きたときに、イベントが通知される、というものです。
「ボタンが押されたよ!」「マウスが動いたよ!」

それに対して、このページでお話しするのは、こちらから、現在の入力状態を質問する方法です。
「今、このボタンは押されてますか?」「マウスカーソルは今どの位置にいますか?」
キーボードクラス
キーボードの状態を取得するには sf::Keyboardクラスを使います。 メソッドは「isKeyPressed()」1つだけ。 引数で指定されたキーコードのキーが押されているかどうかをチェックするよ。 このメソッドはスタティックなので、sf::Keyboardクラスのインスタンスを生成する必要はありません。

このメソッドはウィンドウのフォーカスの状態を無視して、ダイレクトにキーボードの状態を取得します。 なので、ウィンドウが非活性だったとしても、キーが押されていれば、メソッドの戻り値は true です。
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    // 左ボタンが押されているぞ! さぁ、マ○オ的な何かを左へ歩かせるんだ!
    character.move(1, 0);
}
キーコードは 列挙型 sf::Keyboard::Key に定義されてます。
OS やキーボードレイアウトによっては、うまく扱えないキーがあります。 SFML の今後のバージョンアップで改善される、といいな。
マウスクラス
マウスの状態を取得するには、sf::Mouseクラスを使います。 お友達の sf::Keyboardちゃんと同じように、sf::Mouseちゃんもスタティックメソッドを1つ持ってるだけです。 なのでインスタンス生成はしないでね。(今のところ SFML では複数のマウスを同時に扱う機能はサポートしてません)

マウスのボタンが押されているかどうかは、こんなふうにチェックするよ。
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
    // 左クリックされた? ミサイル発射だ!
    gun.fire();
}
マウスのボタンを表すコードは 列挙型 sf::Mouse::Button で定義されてます。
[ソースコード "include/SFML/Window/Mouse.hpp" より]

enum Button
{
    Left,       ///< The left mouse button
    Right,      ///< The right mouse button
    Middle,     ///< The middle (wheel) mouse button
    XButton1,   ///< The first extra mouse button
    XButton2,   ///< The second extra mouse button

    ButtonCount ///< Keep last -- the total number of mouse buttons
};
上の定義を見てお分かりのように、SFMLではボタンは5つサポートされてます。左、右、真ん中(ホイール)の3つと、エキストラボタンが2つです。

ボタンが押されてるかどうかに加えて、マウスの位置も取得できます。 位置はデスクトップ上の座標でも、特定のウィンドウ上での座標でも、どちらでも取得できます。
// マウスの絶対座標を取得(デスクトップ上の座標)
sf::Vector2i globalPosition = sf::Mouse::getPosition();

// マウスの位置を、指定のウィンドウ上の座標で取得(相対座標)
sf::Vector2i localPosition = sf::Mouse::getPosition(window); // window の型は sf::Window
// マウスの位置を絶対座標(デスクトップ上の座標)で設定
sf::Mouse::setPosition(sf::Vector2i(10, 50));

// マウスの位置を指定のウィンドウ内の座標(相対座標)で設定
sf::Mouse::setPosition(sf::Vector2i(10, 50), window); // window の型は sf::Window
マウスホイールの回転量については、「現在の状態」を取得するためのメソッドはありません。 回転量は「直前の状態と比べての回転量」なので、「現在の状態」というものは、ない、のです。
ん? どういうこと?
キーが押されているかどうかは、そのキーを見れば分かります。 マウスの位置は、マウスカーソルを見れば分かります。 でも、マウスホイールを見ても、回転量や方向は分かりません。 回転量や方向はホイールが動いたときにイベントとして通知されるのみです。(MouseWheelMovedイベント)
※ 訳注 ※
SFML2.3以降、MouseWheelMoved は非推奨になり、代わりに MouseWheelScrolled が追加されました。 (チュートリアル:イベント)
ジョイスティッククラス
ゲームパッドの状態は sf::Joistickクラスで取得します。 このクラスも例によってスタティックメソッドだけです。

ゲームパッドはインデックスで識別されます。
インデックスは 0~7 です。なんでかというと、SFMLがサポートできるのは 8個までだからです。 そんなわけで、このクラスのどのメソッドも、最初の引数はパッドのインデックスです。

パッドが接続されてるかどうかを確認するサンプルです。
if (sf::Joystick::isConnected(0))
{
    // 0番のパッドが接続されている
    ...
}
パッドのスペックも取得できます。
// 0番のパッドにはボタンが何個ありますか?
unsigned int buttonCount = sf::Joystick::getButtonCount(0);

// 0番のパッドにはZ方向のスティックがついてますか?
bool hasZ = sf::Joystick::hasAxis(0, sf::Joystick::Z);
スティックの軸名は 列挙型 sf::Joystick::Axis で定義されてます。 ボタンは単に 0~31の数字で識別します。

[ソースコード "include/SFML/Window/Joustick.hpp" より]

enum Axis
{
    X,    ///< The X axis
    Y,    ///< The Y axis
    Z,    ///< The Z axis
    R,    ///< The R axis
    U,    ///< The U axis
    V,    ///< The V axis
    PovX, ///< The X axis of the point-of-view hat
    PovY  ///< The Y axis of the point-of-view hat
};

さてさて、それでは、お待ちかね、ゲームパッドの状態を取得するサンプルですよー。
// 0番のパッドの 1番のボタンが押されてる?
if (sf::Joystick::isButtonPressed(0, 1))
{
    // 押されてる。撃てー!
    gun.fire();
}

// 0番のパッドの スティックの X値とY値を取得
float x = sf::Joystick::getAxisPosition (0, sf::Joystick::X);
float y = sf::Joystick::getAxisPosition (0, sf::Joystick::Y);

// 上下左右にキャラを動かす! ゲームプログラミングっぽいぃぃぃ!
character.move(x, y);
ゲームパッドの状態はイベントループの中で更新されます。 イベントループがなかったり、イベントループが始まる前にパッドの状態を取得したい (接続されてるかどうか、など)ときは、パッドの状態を最新にするために、sf::Joystick::update()関数を呼んでおく必要があります。