Картовое устройство наклон к гравитации Physicsworld?

StackOverflow https://stackoverflow.com//questions/25069161

  •  26-12-2019
  •  | 
  •  

Вопрос

Я строю «мраморную» лабиринтную игру, чтобы изучить основы spritekit.

Я хочу сопоставить гравитацию игры на наклон устройства.Я пытался выяснить, как это сделать, но я смог успешно сопоставить ось Y:

class func obtainGravity(motionManager: CMMotionManager) {
    var vec = CGVectorMake(0, 0)
    if let attitude = motionManager.deviceMotion?.attitude? {
        let y = CGFloat(-attitude.pitch * 2 / M_PI) // This works, it returns 1/-1 when the device is vertical (1 when the home button is upside down)
        let x = CGFloat(attitude.roll * 2 / M_PI) // This doesn't work
        physicsWorld.gravity = CGVectorMake(x, y)
    }
}   
.

Я могу сопоставить ось Y, которая заставляет мяч пройти «вверх» или «вниз» (относительно портретного режима), однако я не понимаю, как сопоставить ось X (тянуть со стороны устройства).

Например, при наведении плоского устройства на таблицу (x, y) должно быть (0,0) и при наведении его на стол на экране таблицы должно также быть (0,0), однако отношение.-179.Кроме того, если я сохраню свое устройство Vertical (в портретном режиме) и включите ноги, сохраняя устройство, гравитация должна оставаться (x: 0, Y: 1), однако X продолжает меняться, как он основан на отношении. Колл

Как это можно сделать?

Это было полезно?

Решение

Самый простой способ быть принять обновления акселерометра, а не обновления движения устройства, а непосредственно прочитайте вектору тяжести оттуда - это именно то, что акселерометр захватывает: мера тяжести в системе координат устройства.

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

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top