がりらぼ

WindowsRuntimeの応援ブログ

MonoGameWindowsRuntimeゲームプログラミング入門vol10:ゲームコントローラの入力を検知する

ゲームコントローラ入力

複雑なWindowsゲームとなると、どうしてもタッチやマウスだけでは対応できなくなります。

より快適にゲームをプレイしてもらえるように、MonoGameはゲームコントローラの入力にも対応しています。

しかし、ゲームコントローラはだれでも持ってるわけではないので、あくまでオプションのような位置づけで実装します。

 

XInput

XInputとは、XBox360のコントローラからの入力を検知するAPIとしてDirectXに実装されています。

MonoGameでも同じようにXInputに対応したコントローラの入力を検知することができます。

また、HID(ヒューマンインターフェースデバイス)対応である場合、WindowsRuntimeでは外部ドライバを使わずに標準で認識することができます。

Windowのゲームを作るにあたってはXBox360のコントローラが推奨ですが、XInputやHIDに対応したコントローラならば対応することができます。

 

95

 

96

 

 

各ボタンの取りうる値

Button

ボタンはButtonState列挙型によって、PressedかReleasedのどちらかの値をとります。

  • StartButton
  • BackButton
  • A Button
  • B Button
  • X Button
  • Y Button
  • DPad Left
  • DPad Right
  • DPad Up
  • DPad Down
  • Right Shoulder
  • LeftShoulder

はすべてButtonStateの値を返します。

Thumb Stick

Thumb Stickはスティックで4方向の入力を受け付けます。

一つの軸に対して、-1.0~1.0までの連続的な値を返します。

97

99

98

100

 

Trigger

トリガーは右と左についていて、0.0~1.0までの連続的な入力を受け付けます。

どれだけ深く入力しているかを検知することができます。

101

102

 

 

GamePad

ゲームパッドからの入力を受け付けるにはGamePadクラスのGetStateメソッドを実行します。

GetStateメソッドでPlayerIndex列挙型を与えて、何番目のコントローラかを判断します。

コントローラは最大4つまで受け付けることができます。

GamePadState gState = GamePad.GetState(PlayerIndex.One);
if (gState.IsConnected)
{
    text = "";
    if (gState.Buttons.A == ButtonState.Pressed)
    {
        text += " A ";
    }
    if (gState.Buttons.B == ButtonState.Pressed)
    {
        text += " B ";
    }
    if (gState.Buttons.X == ButtonState.Pressed)
    {
        text += " X ";
    }
    if (gState.Buttons.Y == ButtonState.Pressed)
    {
        text += " Y ";
    }
    if (gState.Buttons.Start == ButtonState.Pressed)
    {
        text += " Start ";
    }
    if (gState.Buttons.Back == ButtonState.Pressed)
    {
        text += " Back ";
    }
    if (gState.Buttons.BigButton == ButtonState.Pressed)
    {
        text += " BigButton ";
    }
    if (gState.DPad.Left == ButtonState.Pressed)
    {
        text += " DPad Left ";
    }
    if (gState.DPad.Right == ButtonState.Pressed)
    {
        text += " DPad Right ";
    }
    if (gState.DPad.Up == ButtonState.Pressed)
    {
        text += " DPad Up ";
    }
    if (gState.DPad.Down == ButtonState.Pressed)
    {
        text += " DPad Down ";
    }
    if (gState.Buttons.LeftShoulder == ButtonState.Pressed)
    {
        text += " Shoulder Left ";
    }
    if (gState.Buttons.RightShoulder == ButtonState.Pressed)
    {
        text += " Shoulder Right ";
    }
    float lX = gState.ThumbSticks.Left.X;
    float lY = gState.ThumbSticks.Left.Y;

    float rX = gState.ThumbSticks.Right.X;
    float rY = gState.ThumbSticks.Right.Y;

    float tL = gState.Triggers.Left;
    float tR = gState.Triggers.Right;

    text += " LeftStick X" + lX +" ";
    text += " LeftStick Y" + lY + " ";
    text += " RightStick X" + rX + " ";
    text += " RightStick Y" + rY + " ";
    text += " Trigger R" + tR + " ";
    text += " Trigger L" + tL + " ";

 

サンプル

public class Game1 : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    SpriteFont font;
    string text;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

    }


    protected override void Initialize()
    {
        text = "no state";
        base.Initialize();
    }


    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        font = Content.Load<SpriteFont>("TestFont");
  
    }

    protected override void UnloadContent()
    {
        
        
    }


    protected override void Update(GameTime gameTime)
    {
        
        GamePadState gState = GamePad.GetState(PlayerIndex.One);
        if (gState.IsConnected)
        {
            text = "";
            if (gState.Buttons.A == ButtonState.Pressed)
            {
                text += " A ";
            }
            if (gState.Buttons.B == ButtonState.Pressed)
            {
                text += " B ";
            }
            if (gState.Buttons.X == ButtonState.Pressed)
            {
                text += " X ";
            }
            if (gState.Buttons.Y == ButtonState.Pressed)
            {
                text += " Y ";
            }
            if (gState.Buttons.Start == ButtonState.Pressed)
            {
                text += " Start ";
            }
            if (gState.Buttons.Back == ButtonState.Pressed)
            {
                text += " Back ";
            }
            if (gState.Buttons.BigButton == ButtonState.Pressed)
            {
                text += " BigButton ";
            }
            if (gState.DPad.Left == ButtonState.Pressed)
            {
                text += " DPad Left ";
            }
            if (gState.DPad.Right == ButtonState.Pressed)
            {
                text += " DPad Right ";
            }
            if (gState.DPad.Up == ButtonState.Pressed)
            {
                text += " DPad Up ";
            }
            if (gState.DPad.Down == ButtonState.Pressed)
            {
                text += " DPad Down ";
            }
            if (gState.Buttons.LeftShoulder == ButtonState.Pressed)
            {
                text += " Shoulder Left ";
            }
            if (gState.Buttons.RightShoulder == ButtonState.Pressed)
            {
                text += " Shoulder Right ";
            }
            float lX = gState.ThumbSticks.Left.X;
            float lY = gState.ThumbSticks.Left.Y;

            float rX = gState.ThumbSticks.Right.X;
            float rY = gState.ThumbSticks.Right.Y;

            float tL = gState.Triggers.Left;
            float tR = gState.Triggers.Right;

            text += " LeftStick X" + lX +" ";
            text += " LeftStick Y" + lY + " ";
            text += " RightStick X" + rX + " ";
            text += " RightStick Y" + rY + " ";
            text += " Trigger R" + tR + " ";
            text += " Trigger L" + tL + " ";

        }


        base.Update(gameTime);
    }


    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        spriteBatch.DrawString(font,text,new Vector2(0,10),Color.White);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

 

103

 

 

サンプルコード

SmapleGameMono_8_InputGamePad.zip

 

ゲームコントローラ入力を検知する | garicchi.com

目次