Гоночный руль и принудительная обратная связьRacing wheel and force feedback

На этой странице описаны основы программирования для одноэлементных колес Xbox с помощью Windows. Gaming. input. раЦингвхил и связанных API-интерфейсов для универсальная платформа Windows (UWP).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
  • как считывать входные данные с одного или нескольких гоночных рулей;how to read input from one or more racing wheels
  • как отправлять команды обратной связи по усилию;how to send force feedback commands
  • принципы работы гоночных рулей в качестве устройств для навигации по пользовательскому интерфейсу.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. Поддержка гоночных рулей в приложениях UWP для Windows 10 и Xbox One реализована с помощью пространства имен 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, предлагают различные наборы дополнительных возможностей устройств и различные уровни поддержки этих возможностей. Этот уровень вариации между одним типом входного устройства уникален среди устройств, поддерживаемых API Windows. Gaming. Input .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 navigation

Чтобы облегчить задачу обеспечения поддержки разных устройств ввода для навигации в пользовательском интерфейсе и сохранить единообразие используемых для этого элементов управления в разных играх и на разных устройствах, большинство физических устройств ввода параллельно выполняют функцию отдельного логического устройства ввода под названием контроллер навигации в пользовательском интерфейсе.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. Контроллер навигации в пользовательском интерфейсе предоставляет стандартный набор элементов управления для команд навигации в пользовательском интерфейсе на разных устройствах ввода.The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

В силу того, что способ управления в них продиктован использованием исключительно аналоговых средств управления, и в силу некоторой степени различий между разными гоночными рулями, они, как правило, оснащаются цифровой крестовиной, кнопками View (Вид), Menu (Меню), A, B, X и 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.

В качестве контроллера навигации пользовательского интерфейса колеса по пропуску сопоставляют требуемый набор команд навигации с кнопками левого стика, D-Pad, представлений, меню, 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
ЛевыйLeft Крестовина влевоD-pad left
ПравыйRight Крестовина вправоD-pad right
ПредставлениеView Кнопка просмотраView button
МенюMenu Кнопка менюMenu button
ПринятьAccept Кнопка AA button
ОтменитьCancel Кнопка BB 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
PAGE UPPage Up непостоянноvaries
PAGE DOWNPage Down непостоянноvaries
PAGE LEFTPage Left непостоянноvaries
PAGE RIGHTPage Right непостоянноvaries
Прокрутка вверхScroll Up непостоянноvaries
Прокрутка внизScroll Down непостоянноvaries
Прокрутка влевоScroll Left непостоянноvaries
Прокрутить вправоScroll Right непостоянноvaries
Контекстный вызов 1Context 1 Кнопка "X" (как правило)X Button (commonly)
Контекстный вызов 2Context 2 Кнопка "Y" (как правило)Y Button (commonly)
Контекстный вызов 3Context 3 непостоянноvaries
Контекстный вызов 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.

К дополнительным элементам управления относятся ручной тормоз, сцепление и рычаг переключения передач. Вы можете определить, поддерживает ли подключенный руль эти элементы управления, выполнив считывание свойств HasHandbrake, HasClutch и 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, это значит, что рычаг переключения передач поддерживает задний ход, нейтральную передачу, первую, вторую, третью и четвертую передачи.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

Каждая кнопка колесика прокрутки — содержит четыре направления D-панели, предыдущие шестеренки и кнопки со следующими кнопками, а 16 дополнительных кнопок — — цифровое чтение, которое показывает, была ли она нажата (вниз) или снята (up).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.

Примечание

Гоночные рули оснащаются дополнительными кнопками, используемыми для навигации в пользовательском интерфейсе, такими как кнопки View и Menu.Racing wheels are equipped with additional buttons used for UI navigation such as the View and Menu buttons. Эти кнопки не являются частью перечисления RacingWheelButtons и данные с них можно считать, только если войти в гоночный руль как в устройство навигации в пользовательском интерфейсе.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. Дополнительные сведения см. в разделе Устройство навигации по пользовательскому интерфейсу.For more information, see UI Navigation Device.

Значения кнопок считываются из свойства Buttons структуры RacingWheelReading.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).

Следующий пример кода определяет, нажата ли кнопка Next Gear.The following example determines whether the Next Gear button is pressed.

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

Следующий пример кода определяет, отпущена ли кнопка "Next Gear".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. Сведения о том, как определить эти условия, см. в разделах Определение положений кнопки и Определение сложных схем положений кнопок.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. Значение положения рулевого колеса считывается из свойства Wheel структуры RacingWheelReading.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. Значение элемента управления газом считывается из свойства Throttle структуры RacingWheelReading, а значение элемента управления тормозом считывается из свойства 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. Значение элемента управления ручным тормозом считывается из свойства Handbrake структуры RacingWheelReading, а значение элемента управления сцеплением считывается из свойства 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. Значение смещения шаблона считывается из свойства паттерншифтержеар структуры раЦингвхилреадинг .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. Простой стратегией унификации использования этих устройств ввода, когда оба из них имеются в наличии, будет игнорирование рычага переключения передач (и сцепления) при выборе игроком автоматической коробки переключения передач для своего автомобиля, а также игнорирование кнопки Предыдущей и Следующей передачи при выборе игроком ручной коробки переключения передач для своего автомобиля, только если гоночный руль игрока оснащен элементом управления рычагом переключения передач.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.

Запуск примера кода InputInterfacingRun the InputInterfacing sample

В примере кода InputInterfacingUWP (в центре GitHub) показано, как использовать гоночные рули и разные типы устройств ввода вместе, а также представлено, как эти устройства ввода работают в качестве контроллеров навигации в пользовательском интерфейсе.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 One в приложениях UWP с помощью пространства имен Windows. Gaming. input. форцефидбакк .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. Обратная связь по усилию не поддерживается, если свойство WheelMotor имеет значение ноль. В противном случае обратная связь по усилию поддерживается и вы можете определить конкретные возможности обратной связи моторчика (например, оси, на которые он воздействует).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. Предоставляется ряд основных эффектов. пользовательские эффекты можно создавать с помощью класса, реализующего интерфейс ифорцефидбаккеффект .A number of basic effects are provided; custom effects can be created through a class that implements the IForceFeedbackEffect interface.

Класс эффекта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 гоночного руля либо по отдельности путем вызова функций непосредственно в самом эффекте обратной связи.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