Картовое устройство наклон к гравитации Physicsworld?
-
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))
}
.