Отображение привязки устройства к движению персонажа (и т. Д.)

Контекст – это игра iPad, в которой я хочу, чтобы экранный объект контролировался наклоном X / Y устройства.

Мне было интересно, может ли кто-нибудь указать мне в сторону ресурсов для принятия решения о соответствующем картировании наклона к поведению движения (например, люди склонны использовать «сырые» значения вращения для управления ускорением, скоростью или прямой позицией и как были найдены удобные игроки с этими различными типами «отображения» вращения устройства на движение объекта).

Я признателен, что соответствующий выбор может зависеть от конкретного типа контролируемой игры / объекта и что для этого потребуются некоторые пробные и ошибки, но я задавался вопросом, насколько, по крайней мере, какие существующие знания существуют.

Сначала вы захотите применить фильтр нижних частот для изоляции наклона от шума и дрожащих рук вашего пользователя, Apple показывает это в своих примерах акселерометра

x = accel.x * alpha + x * (1.0 - alpha); y = accel.y * alpha + y * (1.0 - alpha); 

более альфа вызывает большую отзывчивость за счет более шумного ввода.

Если ваша игра не преднамеренно имитирует балансировку мяча на лицевой стороне экрана, вы, вероятно, не хотите применять ваши значения наклона к ускорению, а скорее предназначаете скорость или целевое положение, применяя «фальшивое» плавное ускорение, чтобы получить его там.

Кроме того, этот ответ имеет четкую идею, если Unity3d является приемлемым для вашего проекта, и в этой статье есть некоторые удобные номера на практических ограничениях использования управления наклоном в качестве входных данных, в том числе в том, что важно, чтобы пользователи имели гораздо более легкое время, контролирующее положение абсолютного угла чем скорость наклона.

Итак, мы хотим переместить наш характер – мы назовем его «loco» – на основе данных x и y акселерометра.

Теперь, если мы хотим, чтобы величина наклона влияла на скорость перемещения локомотива, мы можем просто вычислить значение акселерометра x или y прямо в нашем алгоритме для его движения.

Например: (psuedocode)

 // we'll call our accelerometer value for x 'tiltX' // tiltX is .5; // assume that accelerometer updated the latest x value to .5 // unitOfMovement = 1; // some arbitraty increment you choose for a unit of movement loco.x += unitOfMovement * tiltValueX; 

Это заставит loco перемещать это число пикселей для каждого игрового цикла (или любого цикла, в котором вы двигаете обновления для движения), и что здесь 1 пиксель, умноженный на значение акселерометра. Поэтому, если символ обычно перемещает 1 пиксель прямо на полном tiltX (1.0), то, если tiltX входит с акселерометра в .5, loco будет перемещать половину этого. Когда значение tiltX увеличивается, так же будет движение Loco.

Другое соображение заключается в том, хотите ли вы, чтобы движение было напрямую связано со скоростью акселерометра? Вероятно, нет, поэтому вы можете использовать массив, чтобы просто удерживать последние десять значений x (то же понятие для значений y), отправленных акселерометром, и использовать последнее среднее значение массива (сумма значений x / количество элементов в массиве) в каждый игровой цикл. Таким образом, чувствительность будет более уместной, чем движение движения по любой скорости обновления акселерометра.

Посмотрите на Point in Tilt Direction – iPhone, который является первым ответом, очень полезен, я думаю.

Interesting Posts
Давайте будем гением компьютера.