Mapa do dispositivo de inclinação para physicsWorld gravidade?
-
26-12-2019 - |
Pergunta
Eu estou construindo um "mármore" jogo de labirinto, a fim de aprender spritekit básico.
Eu quero para mapear a gravidade do jogo para a inclinação do dispositivo.Eu estive tentando descobrir como fazer isso, mas eu só estive capaz de mapear o eixo y com êxito:
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)
}
}
Eu poderia mapear o eixo Y, que faz a bola ir "para cima" ou "para baixo" (em relação ao modo retrato) no entanto, eu não entendo como mapear o eixo X (o puxe a partir do lado do dispositivo).
Por exemplo, ao colocar o dispositivo de televisão na tabela (x, y) deve ser (0,0) e quando colocá-lo no ecrã de tabela-lo, deve também ser (0,0), no entanto a atitude.rolo retorna -179.Também se eu manter o meu dispositivo vertical (no modo retrato) e ative os meus pés, mantendo o dispositivo ainda, a gravidade deve permanecer (x:0, y:1) no entanto x continua a mudar, como ele é baseado na atitude.rolo
Como isso pode ser feito?
Solução
A maneira mais simples seria a de tomar o acelerômetro atualizações, não dispositivo de movimento atualizações, e ler diretamente o vetor de gravidade de lá — que é exatamente o que o acelerômetro captura:uma medida da gravidade no dispositivo do sistema de coordenadas.
Infelizmente eu sou um Swift thickie portanto, não pode fornecer o código de exemplo, mas você está olhando para fornecer um bloco do tipo CMAccelerometerHandler
que irá receber uma CMAccelerationData
a partir do qual você pode obter CMAcceleration
estrutura e que é, diretamente, o vetor de gravidade para aplicar.
if let data = motionManager.accelerometerData? {
vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}