レース ホイールとフォース フィードバックRacing wheel and force feedback

このページを使用して Xbox One racing 車輪のプログラミングの基礎を説明する[Windows.Gaming.Input.RacingWheel] racingwheelおよび関連するユニバーサル Windows プラットフォーム (UWP) Api です。This page describes the basics of programming for Xbox One racing wheels using Windows.Gaming.Input.RacingWheel and related APIs for the Universal Windows Platform (UWP).

ここでは、次の項目について紹介します。By reading this page, you'll learn:

  • 接続されているレーシング ハンドルとそのユーザーの一覧を収集する方法how to gather a list of connected racing wheels and their users
  • レーシング ハンドルが追加または削除されたことを検出する方法how to detect that a racing wheel has been added or removed
  • 1 つ以上のレーシング ハンドルの入力を読み取る方法how to read input from one or more racing wheels
  • フォース フィードバック コマンドを送信する方法how to send force feedback commands
  • UI ナビゲーション デバイスとしてのレーシング ハンドルの動作how racing wheels behave as UI navigation devices

レーシング ハンドルの概要Racing wheel overview

レーシング ハンドルは、本物のレースカーのコックピットを模した入力デバイスです。Racing wheels are input devices that resemble the feel of a real racecar cockpit. 車やトラックが登場するレーシング ゲームで、アーケード スタイルとシミュレーション スタイルのどちらのゲームにも最適な入力デバイスです。Racing wheels are the perfect input device for both arcade-style and simulation-style racing games that feature cars or trucks. レーシング ハンドルは、Windows 10 および Xbox One UWP アプリで Windows.Gaming.Input 名前空間によってサポートされています。Racing wheels are supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input namespace.

Xbox One レーシング ハンドルは、さまざまな価格で提供されています。概して、価格が高いほど、入力とフォース フィードバック機能が優れています。Xbox One racing wheels are offered at a variety of price points, generally having more and better input and force feedback capabilities as their price points rise. どのレーシング ハンドルにも、アナログのステアリング ハンドル、アナログのスロットルおよびブレーキのコントロール、ハンドル上のいくつかのボタンを備えています。All racing wheels are equipped with an analog steering wheel, analog throttle and brake controls, and some on-wheel buttons. 一部のレーシング ハンドルには、さらに、アナログのクラッチとハンドブレーキのコントロール、シフト レバー、およびフォース フィードバック機能もあります。Some racing wheels are additionally equipped with analog clutch and handbrake controls, pattern shifters, and force feedback capabilities. レーシング ハンドルの機能セットはどれも同じではなく、特定の機能のサポート状況も異なる可能性があります — たとえば、ステアリング ハンドルがサポートする回転の範囲や、シフト レバーがサポートするギア数は異なっている可能性があります。Not all racing wheels are equipped with the same sets of features, and may also vary in their support for certain features—for example, steering wheels might support different ranges of rotation and pattern shifters might support different numbers of gears.

デバイスの機能Device capabilities

Xbox One レーシング車輪をさまざまな異なる省略可能なデバイス機能のセットとこれらの機能のサポートのさまざまなレベルを提供します。このレベルの 1 つの種類の入力デバイスの間の変動がでサポートされているデバイス間で一意で、 Windows.Gaming.Input API。Different Xbox One racing wheels offer different sets of optional device capabilities and varying levels of support for those capabilities; this level of variation between a single kind of input device is unique among the devices supported by the Windows.Gaming.Input API. さらに、流通しているほとんどのデバイスでは、少なくともいくつかのオプションの機能またはその他のバリエーションをサポートします。Furthermore, most devices you'll encounter will support at least some optional capabilities or other variations. そのため、接続されている各レーシング ハンドルの機能を個別に特定し、ゲームに適した機能のバリエーションをすべてサポートすることが重要です。Because of this, it's important to determine the capabilities of each connected racing wheel individually and to support the full variation of capabilities that makes sense for your game.

詳しくは、「レーシング ハンドル機能の特定」をご覧ください。For more information, see Determining racing wheel capabilities.

フォース フィードバックForce feedback

一部の Xbox One レーシング ハンドルには、単なるバイブレーションではなく、真のフォース フィードバック — つまり、ハンドルなどのコントロール軸に実際の力を加えることができます — が備わっていますSome Xbox One racing wheels offer true force feedback—that is, they can apply actual forces on an axis of control such as their steering wheel—not just simple vibration. ゲームはこの機能を利用して、一層の没入感を演出し (クラッシュ ダメージのシミュレーション、"道路の感覚")、運転をさらに難しくします。Games use this ability to create a greater sense of immersion (simulated crash damage, "road feel") and to increase the challenge of driving well.

詳しくは、「フォース フィードバックの概要」をご覧ください。For more information, see Force feedback overview.

UI のナビゲーションUI navigation

ユーザー インターフェイスの操作に異なる入力デバイスをサポートする負担を軽くし、ゲームとデバイス間の整合性を高めるため、ほとんどの物理_入力デバイスは、_ UI ナビゲーション コントローラーと呼ばれる個別の論理_入力デバイスとして同時に機能します_。In order to ease the burden of supporting the different input devices for user interface navigation and to encourage consistency between games and devices, most physical input devices simultaneously act as a separate logical input device called a UI navigation controller. UI ナビゲーション コントローラーは、各種入力デバイスに共通の UI ナビゲーション コマンドのボキャブラリを提供します。The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

デバイスによってアナログ制御をどの程度重視しているかは異なり、レーシング ハンドル間のバリエーションが広いことから、通常は、ゲームパッド と同様の、デジタルの方向パッド、ビューメニューABX、および Y ボタンが搭載されています。これらのボタンはゲームプレイ コマンドのサポートを意図したものではなく、レーシング ハンドル ボタンとしてすぐに利用できるものではありません。Due to their unique focus on analog controls and the degree of variation between different racing wheels, they're typically equipped with a digital D-pad, View, Menu, A, B, X, and Y buttons that resemble those of a gamepad; these buttons aren't intended to support gameplay commands and can't be readily accessed as racing wheel buttons.

UI ナビゲーション コントローラーとして、レーシング ハンドルは、ナビゲーション コマンドの必須セットを左のサムスティック、方向パッド、ビュー ボタン、メニュー ボタン、A ボタン、およびB ボタンにマップします。As a UI navigation controller, racing wheels map the required set of navigation commands to the left thumbstick, D-pad, View, Menu, A, and B buttons.

ナビゲーション コマンドNavigation command レーシング ハンドル入力Racing wheel input
UpUp 方向パッドを上D-pad up
DownDown 方向パッドを下D-pad down
LeftLeft 方向パッドを左D-pad left
Right 方向パッドを右D-pad right
ビューView 表示ボタンView button
MenuMenu メニュー ボタンMenu button
OKAccept A ボタンA button
CancelCancel B ボタンB button

また、一部のレーシング ハンドルでは、ナビゲーション コマンドのオプション セットを、サポートする他の入力にマップしますが、コマンドのマッピングはデバイスによって異なる可能性があります。Additionally, some racing wheels might map some of the optional set of navigation commands to other inputs they support, but command mappings can vary from device to device. 以下のコマンドもサポートすることを検討してください。ただし、ゲームのインターフェイスのナビゲーションの基本コマンドにはしないでください。Consider supporting these commands as well, but make sure that these commands are not essential to navigating your game's interface.

ナビゲーション コマンドNavigation command レーシング ハンドル入力Racing wheel input
PageUpPage Up 異なりますvaries
PageDownPage Down 異なりますvaries
Page LeftPage Left 異なりますvaries
Page RightPage Right 異なりますvaries
Scroll UpScroll Up 異なりますvaries
Scroll DownScroll Down 異なりますvaries
Scroll LeftScroll Left 異なりますvaries
Scroll RightScroll Right 異なりますvaries
Context 1Context 1 X ボタン (一般的な場合)X Button (commonly)
Context 2Context 2 Y ボタン (一般的な場合)Y Button (commonly)
Context 3Context 3 異なりますvaries
Context 4Context 4 異なりますvaries

レーシング ハンドルの検出と追跡Detect and track racing wheels

レーシング ハンドルの検出と追跡の方法はゲームパッドの場合とまったく同じですが、Gamepad クラスの代わりに RacingWheel クラスを使用する点だけが異なります。Detecting and tracking racing wheels works in exactly the same way as it does for gamepads, except with the RacingWheel class instead of the Gamepad class. 詳細については、「ゲームパッドと振動」を参照してください。See Gamepad and vibration for more information.

レーシング ハンドルの読み取りReading the racing wheel

目的のレーシング ハンドルを特定したら、入力を収集する準備は完了です。After you identify the racing wheels that you're interested in, you're ready to gather input from them. ただし、なじみのある一部の他の種類の入力とは違い、レーシング ハンドルはイベントを発生することによって状態の変化を伝えるわけではありません。However, unlike some other kinds of input that you might be used to, racing wheels don't communicate state-change by raising events. 代わりに、イベントを_ポーリング_することで現在の状態を定期的に読み取ります。Instead, you take regular readings of their current states by polling them.

レーシング ハンドルのポーリングPolling the racing wheel

ポーリングでは、明確な時点におけるレーシング ハンドルのスナップショットをキャプチャします。Polling captures a snapshot of the racing wheel at a precise point in time. 入力を収集するこのアプローチはほとんどのゲームに最適です。ゲームのロジックはイベント駆動型ではなく、確定的なループの中で実行されることが一般的なためです。また通常は、徐々に集めた多数の単一の入力によるコマンドを解釈するより、一度に集めた入力によるゲーム コマンドを解釈する方が簡単になります。This approach to input gathering is a good fit for most games because their logic typically runs in a deterministic loop rather than being event-driven; it's also typically simpler to interpret game commands from input gathered all at once than it is from many single inputs gathered over time.

レーシング ハンドルをポーリングするには、GetCurrentReading を呼び出します。この関数はレーシング ハンドルの状態が格納された RacingWheelReading を返します。You poll a racing wheel by calling GetCurrentReading; this function returns a RacingWheelReading that contains the state of the racing wheel.

次の例では、レーシング ハンドルをポーリングして現在の状態を確認します。The following example polls a racing wheel for its current state.

auto racingwheel = myRacingWheels[0];

RacingWheelReading reading = racingwheel->GetCurrentReading();

読み取りデータには、レーシング ハンドルの状態だけでなく、正確にいつ状態が取得されたかを示すタイムスタンプも含まれます。 In addition to the racing wheel state, each reading includes a timestamp that indicates precisely when the state was retrieved. このタイムスタンプは、以前の読み取りのタイミングや、ゲームのシミュレーションのタイミングと関連付けに便利です。The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

レーシング ハンドル機能の特定Determining racing wheel capabilities

レーシング ハンドル コントロールの多くはオプションであるか、必須のコントロールであっても複数のバリエーションをサポートするため、レーシング ハンドルの各読み取りで収集された入力の処理を開始する前に、各レーシング ハンドルの機能を個別に特定する必要があります。Many of the racing wheel controls are optional or support different variations even in the required controls, so you have to determine the capabilities of each racing wheel individually before you can process the input gathered in each reading of the racing wheel.

オプションのコントロールは、ハンドブレーキ、クラッチ、およびシフトレバーです。接続されているレーシング ハンドルがこれらのコントロールをサポートするかどうかは、レーシング ハンドルの HasHandbrakeHasClutch、および HasPatternShifter プロパティをそれぞれ読み取ることで特定できます。The optional controls are the handbrake, clutch, and pattern shifter; you can determine whether a connected racing wheel supports these controls by reading the HasHandbrake, HasClutch, and HasPatternShifter properties of the racing wheel, respectively. プロパティの値が true の場合、コントロールはサポートされています。そうでない場合は、サポートされません。The control is supported if the value of the property is true; otherwise it's not supported.

if (racingwheel->HasHandbrake)
{
    // the handbrake is supported
}

if (racingwheel->HasClutch)
{
    // the clutch is supported
}

if (racingwheel->HasPatternShifter)
{
    // the pattern shifter is supported
}

また、ステアリング ハンドルとシフトレバーも、バリエーションがある可能性があるコントロールです。Additionally, the controls that may vary are the steering wheel and pattern shifter. ステアリング ハンドルでは、実際のハンドルがサポートする物理的な回転の度合いが異なり、シフトレバーでは、各レバーがサポートする前進ギアの数が異なる可能性があります。The steering wheel can vary by the degree of physical rotation that the actual wheel can support, while the pattern shifter can vary by the number of distinct forward gears it supports. レーシング ハンドルの MaxWheelAngle プロパティを読み取ることで、実際のハンドルがサポートする回転の最大角度を特定できます。この値は、サポートされる物理的な最大角度を時計回り (正) と反時計回り (負) で表します。You can determine the greatest angle of rotation the actual wheel supports by reading the MaxWheelAngle property of the racing wheel; its value is the maximum supported physical angle in degrees clock-wise (positive) which is likewise supported in the counter-clock-wise direction (negative degrees). シフトレバーがサポートする最大の前進ギアは、レーシング ハンドルの MaxPatternShifterGear プロパティを読み取ることで特定できます。この値は、サポートされる最大の前進ギアを表します。— つまり、値が 4 の場合、バック ギア、ニュートラル、第 1 ギア、第 2 ギア、第 3 ギア、および第 4 ギアまでサポートされます。You can determine the greatest forward gear the pattern shifter supports by reading the MaxPatternShifterGear property of the racing wheel; its value is the highest forward gear supported, inclusive—that is, if its value is 4, then the pattern shifter supports reverse, neutral, first, second, third, and fourth gears.

auto maxWheelDegrees = racingwheel->MaxWheelAngle;
auto maxShifterGears = racingwheel->MaxPatternShifterGear;

また、一部のレーシング ハンドルでは、ステアリング ハンドルを介したフォース フィードバックをサポートします。Finally, some racing wheels support force feedback through the steering wheel. 接続されているレーシング ハンドルがフォース フィードバックをサポートするかどうかは、レーシング ハンドルの WheelMotor プロパティを読み取ることで特定できます。You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. WheelMotor プロパティの値が null ではない場合、フォース フィードバックはサポートされています。そうでない場合は、サポートされません。Force feedback is supported if WheelMotor is not null; otherwise it's not supported.

if (racingwheel->WheelMotor != nullptr)
{
    // force feedback is supported
}

フォース フィードバックをサポートするレーシング ハンドルのフォース フィードバック機能の使い方について詳しくは、「フォース フィードバックの概要」をご覧ください。For information on how to use the force feedback capability of racing wheels that support it, see Force feedback overview.

ボタンの読み取りReading the buttons

レーシング ハンドルの各ボタン — 方向パッドの 4 方向、前のギア ボタンと次のギア ボタン、その他 16 個のボタン — は、デジタルの読み取り値によって、押されている (ダウン) か離されている (アップ) かを示します。Each of the racing wheel buttons—the four directions of the D-pad, the Previous Gear and Next Gear buttons, and 16 additional buttons—provides a digital reading that indicates whether it's pressed (down) or released (up). 効率を高めるため、ボタンの読み取り値は個別のブール値としては表されません。代わりに、読み取り値はすべて、RacingWheelButtons 列挙型で表される単一のビットフィールドにパックされます。For efficiency, button readings aren't represented as individual boolean values; instead they're all packed into a single bitfield that's represented by the RacingWheelButtons enumeration.

注意

レーシング ハンドルには、ビュー ボタンやメニュー ボタンなど、他にも UI 操作に使用するボタンが搭載されています。Racing wheels are equipped with additional buttons used for UI navigation such as the View and Menu buttons. これらのボタンは RacingWheelButtons 列挙型には含まれず、UI ナビゲーション デバイスとしてレーシング ハンドルを利用する場合にしか、読み取られません。These buttons are not a part of the RacingWheelButtons enumeration and can only be read by accessing the racing wheel as a UI navigation device. 詳しくは、「UI ナビゲーション デバイス」をご覧ください。For more information, see UI Navigation Device.

ボタンの値は、RacingWheelReading 構造体の Buttons プロパティから読み取ります。The button values are read from the Buttons property of the RacingWheelReading structure. このプロパティはビットフィールドであるため、ビット演算子マスクを使用して目的のボタンの値を分離します。Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. 対応するビットが設定されているときはボタンが押されており (ダウン)、それ以外の場合はボタンが離されています (アップ)。The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

次の例では、次のギア ボタンが押されているかどうかを判別します。The following example determines whether the Next Gear button is pressed.

if (RacingWheelButtons::NextGear == (reading.Buttons & RacingWheelButtons::NextGear))
{
    // Next Gear is pressed
}

次の例では、次のギア ボタンが離されているかどうかを判別します。The following example determines whether the Next Gear button is released.

if (RacingWheelButtons::None == (reading.Buttons & RacingWheelButtons::NextGear))
{
    // Next Gear is released (not pressed)
}

たいことがありますから、ボタンが遷移するときに決定するリリースに押された状態または、複数のボタンが押された状態またはリリースされるかどうか、または特定の方法で一連のボタンが配置されている場合に押されたリリース—いくつか押すと、失敗します。Sometimes you might want to determine when a button transitions from pressed to released or released to pressed, whether multiple buttons are pressed or released, or if a set of buttons are arranged in a particular way—some pressed, some not. これらの状態を検出する方法について詳しくは、「Detecting button transitions (ボタンの移行の検出)」および「Detecting complex button arrangements (複雑なボタンのパターンの検出)」をご覧ください。For information on how to detect these conditions, see Detecting button transitions and Detecting complex button arrangements.

ハンドルの読み取りReading the wheel

ステアリング ハンドルは、-1.0 ~ +1.0 のアナログの読み取り値を提供する必須のコントロールです。The steering wheel is a required control that provides an analog reading between -1.0 and +1.0. -1.0 の値はハンドルを最も左に回転した位置に対応し、+1.0 の値はハンドルを最も右に回転した位置に対応します。A value of -1.0 corresponds to the left-most wheel position; a value of +1.0 corresponds to the right-most position. ステアリング ハンドルの値は、RacingWheelReading 構造体の Wheel プロパティから読み取ります。The value of the steering wheel is read from the Wheel property of the RacingWheelReading structure.

float wheel = reading.Wheel;  // returns a value between -1.0 and +1.0.

ハンドルの読み取り値は、物理的なレーシング ハンドルがサポートする回転の範囲に応じて異なる実際のハンドルの物理的な回転の角度に対応しますが、通常はハンドルの読み取り値はハンドルに合わせて調整しません。ハンドルのサポートする回転角度が広くなれば、精度も高くなります。Although wheel readings correspond to different degrees of physical rotation in the actual wheel depending on the range of rotation supported by the physical racing wheel, you don't usually want to scale the wheel readings; wheels that support greater degrees of rotation just provide greater precision.

スロットルとブレーキの読み取りReading the throttle and brake

スロットルとブレーキは、0.0 (完全に離された状態) ~ 1.0 (完全に押された状態) の間の浮動小数点値として表されたアナログ読み取り値をそれぞれ提供する必須のコントロールです。The throttle and brake are required controls that each provide analog readings between 0.0 (fully released) and 1.0 (fully pressed) represented as floating-point values. スロットル コントロールの値は、RacingWheelReading 構造体の Throttle プロパティから、ブレーキ コントロールの値は Brake プロパティから読み取られます。The value of the throttle control is read from the Throttle property of the RacingWheelReading struct; the value of the brake control is read from the Brake property.

float throttle = reading.Throttle;  // returns a value between 0.0 and 1.0
float brake    = reading.Brake;     // returns a value between 0.0 and 1.0

ハンドブレーキとクラッチの読み取りReading the handbrake and clutch

ハンドブレーキとクラッチは、0.0 (完全に離された状態) ~ 1.0 (完全に押された状態) の間の浮動小数点値として表されたアナログ読み取り値をそれぞれ提供するオプションのコントロールです。The handbrake and clutch are optional controls that each provide analog readings between 0.0 (fully released) and 1.0 (fully engaged) represented as floating-point values. ハンドブレーキ コントロールの値は、RacingWheelReading 構造体の Handbrake プロパティから、クラッチ コントロールの値は Clutch プロパティから読み取られます。The value of the handbrake control is read from the Handbrake property of the RacingWheelReading struct; the value of the clutch control is read from the Clutch property.

float handbrake = 0.0;
float clutch = 0.0;

if(racingwheel->HasHandbrake)
{
    handbrake = reading.Handbrake;  // returns a value between 0.0 and 1.0
}

if(racingwheel->HasClutch)
{
    clutch = reading.Clutch;        // returns a value between 0.0 and 1.0
}

シフトレバーの読み取りReading the pattern shifter

シフトレバーは、-1 ~ MaxPatternShifterGear の符号付き整数値として表されたデジタルの読み取り値を提供するオプションのコントロールです。The pattern shifter is an optional control that provides a digital reading between -1 and MaxPatternShifterGear represented as a signed integer value. -1 または 0 は_バック_ ギアと ニュートラル ギアにそれぞれ対応し、正の値が大きくなるほど、高いレベルの前進ギアに対応し、最大のギアは MaxPatternShifterGear になります。A value of -1 or 0 correspond to the reverse and neutral gears, respectively; increasingly positive values correspond to greater forward gears up to MaxPatternShifterGear, inclusive. パターンのシフトの値を読み取ったり、 PatternShifterGearのプロパティ、 RacingWheelReading構造体。The value of the pattern shifter is read from the PatternShifterGear property of the RacingWheelReading struct.

if (racingwheel->HasPatternShifter)
{
    gear = reading.PatternShifterGear;
}

注意

シフトレバーは、サポートされる場合、必須の前のギア ボタンと次のギア ボタンと併せて存在します。これらのボタンも、プレイヤーの車の現在のギア操作に使用されます。The pattern shifter, where supported, exists alongside the required Previous Gear and Next Gear buttons which also affect the current gear of the player's car. シフトレバーとギア ボタンの両方が存在する場合にギアの入力を統合する簡単な方法は、プレイヤーが車に AT (オートマチック トランスミッション) を選択しているときは、シフトレバー (とクラッチ) を無視することです。レーシング ハンドルにシフトレバー コントロールしか搭載されていなくて、プレイヤーが車に MT (マニュアル トランスミッション) を選択しているときは、前のギア ボタンと 次のギア ボタンを無視します。A simple strategy for unifying these inputs where both are present is to ignore the pattern shifter (and clutch) when a player chooses an automatic transmission for their car, and to ignore the Previous and Next Gear buttons when a player chooses a manual transmission for their car only if their racing wheel is equipped with a pattern shifter control. この方法がゲームに適さない場合は、別の統合方法を実装できます。You can implement a different unification strategy if this isn't suitable for your game.

InputInterfacing サンプルの実行Run the InputInterfacing sample

InputInterfacingUWP サンプル (github) は、レーシング ハンドルと、種類の異なる入力デバイスとを組み合わせて使用する方法と、これらの入力デバイスが UI ナビゲーション コントローラーとしてどのように動作するかを示します。The InputInterfacingUWP sample (github) demonstrates how to use racing wheels and different kinds of input devices in tandem, as well as how these input devices behave as UI navigation controllers.

フォース フィードバックの概要Force feedback overview

多くのレーシング ハンドルには、より没入型で、難易度の高いドライブ エクスペリエンスを提供するため、フォース フィードバック機能があります。Many racing wheels have force feedback capability to provide a more immersive and challenging driving experience. フォース フィードバックをサポートするレーシング ハンドルには、通常、単一の軸 (ハンドルの回転軸) に沿ってステアリング ハンドルに力を適用する単一のモーターが搭載されています。Racing wheels that support force feedback are typically equipped with a single motor that applies force to the steering wheel along a single axis, the axis of wheel rotation. Windows 10 と Xbox の 1 つの UWP アプリでフォース フィードバックがサポートされている、 Windows.Gaming.Input.ForceFeedback名前空間。Force feedback is supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input.ForceFeedback namespace.

注意

フォース フィードバック API は、複数軸のフォースをサポートできますが、現時点では、ハンドルの回転軸以外の軸でフィードバックをサポートしている Xbox One レーシング ハンドルはありません。The force feedback APIs are capable of supporting several axes of force, but no Xbox One racing wheel currently supports any feedback axis other than that of wheel rotation.

フォース フィードバックの使用Using force feedback

以下のセクションでは、Xbox One レーシング ハンドルのフォース フィードバック効果のプログラミングの基本を説明します。These sections describe the basics of programming force feedback effects for Xbox One racing wheels. フィードバックは効果を使用して適用されます。効果は、サウンド効果と同様に、まず、フォース フィードバック デバイスに読み込まれたうえで、開始、一時停止、再開、停止の順で実行できるようになります。ただし、レーシング ハンドルのフィードバック機能を最初に特定する必要があります。Feedback is applied using effects, which are first loaded onto the force feedback device and then can be started, paused, resumed, and stopped in a manner similar to sound effects; however, you must first determine the feedback capabilities of the racing wheel.

フォース フィードバック機能の特定Determining force feedback capabilities

接続されているレーシング ハンドルがフォース フィードバックをサポートするかどうかは、レーシング ハンドルの WheelMotor プロパティを読み取ることで特定できます。You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. WheelMotornull の場合は、フォース フィードバックはサポートされません。そうでない場合は、フォース フィードバックはサポートされているので、フォース フィードバックが適用される軸など、モーターの特定のフィードバック機能を特定します。Force feedback isn't supported if WheelMotor is null; otherwise, force feedback is supported and you can proceed to determine the specific feedback capabilities of the motor, such as the axes it can affect.

if (racingwheel->WheelMotor != nullptr)
{
    auto axes = racingwheel->WheelMotor->SupportedAxes;

    if(ForceFeedbackEffectAxes::X == (axes & ForceFeedbackEffectAxes::X))
    {
        // Force can be applied through the X axis
    }

    if(ForceFeedbackEffectAxes::Y == (axes & ForceFeedbackEffectAxes::Y))
    {
        // Force can be applied through the Y axis
    }

    if(ForceFeedbackEffectAxes::Z == (axes & ForceFeedbackEffectAxes::Z))
    {
        // Force can be applied through the Z axis
    }
}

フォース フィードバック効果の読み込みLoading force feedback effects

フォース フィードバック効果は、ゲームのコマンドに対して自律的に "再生" されるフィードバック デバイスに読み込まれます。Force feedback effects are loaded onto the feedback device where they are "played" autonomously at the command of your game. さまざまな基本的な特殊効果が提供されます。カスタム効果を実装するクラスで作成できます、 IForceFeedbackEffectインターフェイス。A number of basic effects are provided; custom effects can be created through a class that implements the IForceFeedbackEffect interface.

Effect クラスEffect class 効果の説明Effect description
ConditionForceEffectConditionForceEffect デバイス内の現在のセンサーに応じて、異なる力を適用する効果です。An effect that applies variable force in response to current sensor within the device.
ConstantForceEffectConstantForceEffect 一定の力を特定のベクトルに沿って適用する効果です。An effect that applies constant force along a vector.
PeriodicForceEffectPeriodicForceEffect 波形によって定義される可変の力を特定のベクトルに沿って適用する効果です。An effect that applies variable force defined by a waveform, along a vector.
RampForceEffectRampForceEffect 線形に増加/減少する力を特定のベクトルに沿って適用する効果です。An effect that applies a linearly increasing/decreasing force along a vector.
using FFLoadEffectResult = ForceFeedback::ForceFeedbackLoadEffectResult;

auto effect = ref new Windows.Gaming::Input::ForceFeedback::ConstantForceEffect();
auto time = TimeSpan(10000);

effect->SetParameters(Windows::Foundation::Numerics::float3(1.0f, 0.0f, 0.0f), time);

// Here, we assume 'racingwheel' is valid and supports force feedback

IAsyncOperation<FFLoadEffectResult>^ request
    = racingwheel->WheelMotor->LoadEffectAsync(effect);

auto loadEffectTask = Concurrency::create_task(request);

loadEffectTask.then([this](FFLoadEffectResult result)
{
    if (FFLoadEffectResult::Succeeded == result)
    {
        // effect successfully loaded
    }
    else
    {
        // effect failed to load
    }
}).wait();

フォース フィードバック効果の使用Using force feedback effects

効果は読み込まれると、レーシング ハンドルの WheelMotor プロパティで関数を呼び出して同期的にまとめて開始、一時停止、再開、停止を行うことも、フィードバック効果自体で関数を呼び出して個別に行うこともできrます。Once loaded, effects can all be started, paused, resumed, and stopped synchronously by calling functions on the WheelMotor property of the racing wheel, or individually by calling functions on the feedback effect itself. 通常は、ゲームプレイを開始する前に使用するすべての効果をフィードバック デバイスに読み込んでおき、ゲームプレイの進行に合わせて、それぞれの SetParameters 関数を使用して効果を更新することをお勧めします。Typically, you should load all the effects that you want to use onto the feedback device before gameplay begins and then use their respective SetParameters functions to update the effects as gameplay progresses.

if (ForceFeedbackEffectState::Running == effect->State)
{
    effect->Stop();
}
else
{
    effect->Start();
}

また、必要な場合はいつでも、特定のレーシング ハンドルで、フォース フィードバック システム全体を非同期に有効化、無効化、またはリセットできます。Finally, you can asynchronously enable, disable, or reset the entire force feedback system on a particular racing wheel whenever you need.

関連項目See also