Windows Phone использует ориентацию для расчета положения - PullRequest
4 голосов
/ 04 января 2012

Я использую Motion API и пытаюсь выяснить схему управления для игры, которую я сейчас разрабатываю.

То, что я пытаюсь достичь, - это ориентировать устройство так, чтобы оно находилось непосредственно в позиции. Так, чтобы наклон телефона вперед и влево означал верхнюю левую позицию, а назад вправо - нижнюю правую.

Фотографии, чтобы сделать его более четким (красная точка будет расчетной позиции).

Tilt left top
Вперед и влево

Tilt right bottom
Назад и вправо

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

Кто-нибудь делал что-нибудь подобное?

Примечания:

  • Я пытался использовать показания рыскания, тангажа, крена и кватерниона.

  • Я только что понял, что поведение, о котором я говорю, будет очень похоже на уровень.

Пример:

// Get device facing vector 
public static Vector3 GetState()
{
    lock (lockable)
    {
        var down = Vector3.Forward;

        var direction = Vector3.Transform(down, state);
        switch (Orientation) {
            case Orientation.LandscapeLeft:
                return Vector3.TransformNormal(direction, Matrix.CreateRotationZ(-rightAngle));
            case Orientation.LandscapeRight:
                return Vector3.TransformNormal(direction, Matrix.CreateRotationZ(rightAngle));
        }

        return direction;
    }
}

1 Ответ

2 голосов
/ 07 января 2012

Вы хотите управлять объектом на экране с помощью датчика ускорения.

protected override void Initialize() {
...
    Accelerometer acc = new Accelerometer();
    acc.ReadingChanged += AccReadingChanged;
    acc.Start();
...
}

Это метод, который вычисляет положение объекта

void AccReadingChanged(object sender, AccelerometerReadingEventArgs e) {
    // Y axes is same in both cases
    this.circlePosition.Y = (float)e.Z * GraphicsDevice.Viewport.Height + GraphicsDevice.Viewport.Height / 2.0f;

    // X axes needs to be negative when oriented Landscape - Left
    if (Window.CurrentOrientation == DisplayOrientation.LandscapeLeft)
        this.circlePosition.X = -(float)e.Y * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width / 2.0f;
    else this.circlePosition.X = (float)e.Y * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width / 2.0f;
}

Я использую оси Z датчика какмой Y в игре и оси Y сенсора как мой X в игре.Калибровка будет выполняться путем вычитания оси Z датчика из центра.Таким образом, наши оси датчиков напрямую соответствуют положению (в процентах) на экране.

Чтобы это работало, нам вообще не нужны оси X датчика ...

Это просто быстрое внедрение.Вы найдете центр для датчика, поскольку это Viewport.Width / 2f не является центром, суммой и средним значением 3 измерений, калибровкой по осям датчика X, чтобы вы могли играть / использовать приложение в горизонтальном или горизонтальном положении и т. Д.

Этот код протестирован на устройстве Windows Phone! (и работает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...