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?

Foi útil?

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))
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top