#region OpenTK

OpenTKがGitHubで更新されるようになりました。NuGetから手に入れることができるようになりました。
現在は.NET Coreに対応する機運があるようです。

ジョイスティックを使う

ジョイスティック対応で よりゲームらしく

ジョイスティックとは、ゲーム用コントローラのことです。OpenTKでは「ゲームパッド」とは区別されているようですが、そのあたりは良くわかりません。(私の手持ちのゲームパッドはジョイスティックとして動きます)

キーボードとマウスという入力方法では難しかったり似合わなかったりするプログラムでも、ジョイスティックを使えば快適な操作にできるかもしれません。

OpenTKでは、ある時点でのジョイスティックのすべての状態を取得してから、ボタンなどの状態をそれぞれ使います。

ボタン・ハットスイッチ・アナログスティック

ソースコードでは、OpenTK 1.1を使っていますので注意してください。それぞれの記述は長めです。

			var state = Joystick.GetState(0);
			if (state.IsConnected)

Joystick.GetState関数で、指定したジョイスティックのすべての状態を取得します。

名前の通り、状態のIsConnectedプロパティはジョイスティックが接続状態かを確認できます。

				// Buttons
				if (state.GetButton(JoystickButton.Button1) == ButtonState.Pressed)
				{
					GL.Color4(Color4.IndianRed);
				}
				else if (state.IsButtonDown(JoystickButton.Button2))
				{
					GL.Color4(Color4.DodgerBlue);
				}

ボタンの状態を確認するには、GetButtonメソッドによる方法とIsButtonDown(or IsButtonUp)による方法があります。

なお、OpenTKの標準ではボタンは押しているか離しているかしかわからないため、複雑なことをする場合は前に取得した状態と比較する必要があります。

				// Hat
				if (state.GetHat(JoystickHat.Hat0).IsUp)
				{
					GL.Color4(Color4.White);
				}
				else if (state.GetHat(JoystickHat.Hat0).Position.HasFlag(HatPosition.Down))
				{
					GL.Color4(Color4.Black);
				}

ハットスイッチ(十字ボタン等?)の状態を確認するには、GetHatメソッドのIsUp(,IsDown, IsLeft or IsRight)で直接確認するか、Positionプロパティで(ビットフィールド)Enumを使って確認します。

この二つの違いは、前者が唯一1つだけ押されているのかを確認するのに対し、後者は他のものと組み合わせたのを含めて押されているかです。(右上を押しているときに↑をそれぞれ確認すると、前者は×で後者は○です。)

				// Axis
				var x = state.GetAxis(JoystickAxis.Axis0);
				var y = state.GetAxis(JoystickAxis.Axis1);
				rotate = rotate * Matrix4.CreateRotationY(0.1f * x) * Matrix4.CreateRotationX(-0.1f * y);

				var zR = state.GetAxis(JoystickAxis.Axis3);
				zoom = zoom + zR * 0.1f;

アナログスティックやアナログトリガーの状態を確認するには、GetAxisメソッドを使います。

この戻り値は-1.0f~1.0fの範囲の数値で、2方向に動くスティックに対しては2つのAxisが対応しているはずです。

記事

外部リンク

Thanks