ジョイスティック
Joystickクラスはジョイスティックコントローラーについての機能を提供します。 コントローラーの検出やコントローラー情報の取得、ボタンやスティックの入力の取得が可能です。
SDL GameControllerDBに対応しているコントローラー(およそ数百種類)では、JoystickButtonやJoystickAxisを利用して抽象化されたコントローラーへのアクセスが可能です。
基本的な呼び出し手順
Altseed2のInitializeを呼び出した後、Engine.Joystick
という形でJoystickの各種メソッドを呼び出してください。
Joystickを接続・取り外しした際には、自動的にインデックスが更新されます。
ジョイスティックの情報の取得
Engine.Joystick.GetJoystickInfo(int joystickIndex)を利用して、指定したインデックスのジョイスティックの情報を取得できます。
返り値はJoystickInfoです。
ジョイスティックが接続されていない場合はnull
を返します。
JoystickInfoを通して、ジョイスティックの情報を取得できます。
- IsGamepad: ジョイスティックがGameControllerDBに登録された製品かどうかを取得できます。
- GamepadName: IsGamepadが
true
の場合にのみ使えます。GameControllerDBに登録された、わかりやすい名前を取得できます。 - Name: IsGamepadが
false
の場合はこちらを利用してください。
また、Engine.Joystick.IsPresent(int joystickIndex)を利用しても、指定したインデックスにジョイスティックが接続されているかどうかを取得できます。
ボタン入力の取得
ボタンの取得は以下のメソッドを用いて行います。 第一引数に取得したいジョイスティックコントローラーのインデックスを指定します。 戻り値はButtonStateです。
GetButtonState(int joystickIndex, JoystickButton button)
第2引数にJoystickButtonを指定します。
JoystickInfoのIsGamepadがtrue
の時のみ利用できます。
GetButtonState(int joystickIndex, int buttonIndex)
第2引数にボタンのインデックスを指定します。
using System;
using Altseed2;
using System.Linq;
namespace Sample
{
class JoystickButtonSample
{
static void Main(string[] args)
{
// Altseed2 を初期化します。
Engine.Initialize("JoystickButton", 640, 480);
// 状態を出力するための TextNode を作成します。
// 詳細は TextNode のサンプルを参照してください。
var font = Font.LoadDynamicFont("./mplus-1m-regular.ttf", 64);
var textNode = new TextNode();
textNode.Font = font;
textNode.FontSize = 20;
Engine.AddNode(textNode);
while (Engine.DoEvents())
{
var displayText = "";
var info = Engine.Joystick.GetJoystickInfo(0);
// 指定したインデックスのジョイスティックが接続しているかどうかを確認します。
// Joystick.IsPresentも利用できます。(こちらの方が高速)
if (info is null)
{
displayText = "コントローラーが接続されていません。\n";
}
else
{
displayText += $"コントローラー名: {info.Name}\n";
displayText += $"プロダクトID: {info.Product}\n";
displayText += $"ベンダーID: {info.Vendor}\n";
if (info.IsGamepad)
{
// ゲームパッドとして登録されているJoystickの場合
// Nameよりもわかりやすい名前を取得可能です。
displayText += $"ゲームパッド名: {info.GamepadName}\n";
foreach (var buttonType in Enum.GetValues(typeof(JoystickButton)).Cast<JoystickButton>())
{
// ジョイスティックコントローラーのボタン入力を取得します。
// ジョイスティックのインデックスと確認したいジョイスティックボタンを指定します。
// 第一引数: ジョイスティックのインデックス
// 第二引数: ジョイスティックボタンの種類(対応しているコントローラーでのみ利用可能)
var state = Engine.Joystick.GetButtonState(0, buttonType);
var buttonName = buttonType.ToString();
displayText += state switch
{
ButtonState.Free => $"{buttonName}が離されています\n",
ButtonState.Hold => $"{buttonName}が押されています\n",
ButtonState.Release => $"{buttonName}が離されました!\n",
ButtonState.Push => $"{buttonName}が押されました!\n",
_ => $"{buttonName}が想定されていない状態({(int)state})です\n",
};
}
}
else
{
// ゲームパッドとして登録されていないJoystickの場合
displayText += $"ゲームパッドとして登録されていません。\n";
for (int buttonIndex = 0; buttonIndex < info.ButtonCount; buttonIndex++)
{
// ジョイスティックコントローラーのボタン入力を取得します。
// ジョイスティックのインデックスと確認したいボタンインデックスを指定します。
// 第一引数: ジョイスティックのインデックス
// 第二引数: ジョイスティックのボタンのインデックス
var state = Engine.Joystick.GetButtonState(0, buttonIndex);
displayText += state switch
{
ButtonState.Free => $"{buttonIndex}番目のボタンが離されています\n",
ButtonState.Hold => $"{buttonIndex}番目のボタンが押されています\n",
ButtonState.Release => $"{buttonIndex}番目のボタンが離されました!\n",
ButtonState.Push => $"{buttonIndex}番目のボタンが押されました!\n",
_ => $"{buttonIndex}番目のボタンが想定されていない状態({(int)state})です\n",
};
}
}
}
textNode.Text = displayText;
// Altseed2 の各種更新処理を行います。
Engine.Update();
}
// Altseedの終了処理をします。
Engine.Terminate();
}
}
}
スティック入力の取得
スティックの取得には以下のメソッドを用います。
第一引数に取得したいジョイスティックコントローラーのインデックスを指定します。 戻り値は-1から1の間のfloatです。 取得できる値は、左右スティックの水平方向(LeftX, RightX), 垂直方向(LeftY, RightY)、左右のトリガー(LeftTrigger, RightTrigger)です。
GetAxisState(int joystickIndex, JoystickAxis axis)
第2引数にJoystickAxisを指定します。
JoystickInfoのIsGamepadがtrue
の時のみ利用できます。
GetAxisState(int joystickIndex, int axisIndex)
第2引数にスティックのインデックスを指定します。
using System;
using Altseed2;
using System.Linq;
namespace Sample
{
class JoystickAxisSample
{
static void Main(string[] args)
{
// Altseed2 を初期化します。
Engine.Initialize("JoystickAxis", 640, 480);
// 状態を出力するための TextNode を作成します。
// 詳細は TextNode のサンプルを参照してください。
var font = Font.LoadDynamicFont("./mplus-1m-regular.ttf", 64);
var textNode = new TextNode();
textNode.Font = font;
textNode.FontSize = 30;
Engine.AddNode(textNode);
// ゲームのメインループ
while (Engine.DoEvents())
{
var displayText = "";
var info = Engine.Joystick.GetJoystickInfo(0);
if (info is null)
{
displayText = "コントローラーが接続されていません。\n";
}
else
{
displayText += $"コントローラー名: {info.Name}\n";
displayText += $"プロダクトID: {info.Product}\n";
displayText += $"ベンダーID: {info.Vendor}\n";
if (info.IsGamepad)
{
// ゲームパッドとして登録されているJoystickの場合
displayText += $"ゲームパッド名: {info.GamepadName}\n";
foreach (var axisType in Enum.GetValues(typeof(JoystickAxis)).Cast<JoystickAxis>())
{
// ジョイスティックコントローラーの軸入力を取得します。
// ジョイスティックのインデックスと確認したい軸の種類を指定します。
// 第一引数: ジョイスティックのインデックス
// 第二引数: ジョイスティック軸の種類(対応しているコントローラーでのみ利用可能)
var state = Engine.Joystick.GetAxisState(0, axisType);
displayText += $"{axisType} : {state} \n";
}
}
else
{
// ゲームパッドとして登録されていないJoystickの場合
displayText += $"ゲームパッドとして登録されていません。\n";
for (int axisIndex = 0; axisIndex < info.AxisCount; axisIndex++)
{
// ジョイスティックコントローラーの軸入力を取得します。
// ジョイスティックのインデックスと確認したい軸のインデックスを指定します。
// 第一引数: ジョイスティックのインデックス
// 第二引数: ジョイスティックの軸のインデックス
var state = Engine.Joystick.GetAxisState(0, axisIndex);
displayText += $"{axisIndex}番目のスティック : {state} \n";
}
}
}
textNode.Text = displayText;
// Altseed2 の各種更新処理を行います。
Engine.Update();
}
// Altseedの終了処理をします。
Engine.Terminate();
}
}
}