Pregunta

Estoy construyendo un juego de laberinto de "canicas" para aprender los conceptos básicos del spritekit.

Quiero asignar la gravedad del juego a la inclinación del dispositivo.He estado tratando de descubrir cómo hacerlo pero solo pude mapear el eje y con é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)
    }
}   

Podría mapear el eje Y, lo que hace que la bola "arriba" o "abajo" (en relación con el modo vertical), sin embargo, no entiendo cómo mapear el eje X (el tirón desde el costado del dispositivo).

Por ejemplo, cuando se coloca el dispositivo sobre la mesa (x, y) debe ser (0,0) y cuando se coloca sobre la mesa con la pantalla hacia abajo también debe ser (0,0); sin embargo, actitud.roll devuelve -179.Además, si mantengo mi dispositivo vertical (en modo vertical) y enciendo mis pies manteniendo el dispositivo quieto, la gravedad debería permanecer (x:0, y:1) sin embargo, x continúa cambiando ya que se basa en actitud.roll

¿Cómo se puede hacer esto?

¿Fue útil?

Solución

La forma más sencilla sería tomar actualizaciones del acelerómetro, no actualizaciones de movimiento del dispositivo, y leer directamente el vector de gravedad desde allí; eso es exactamente lo que captura el acelerómetro:una medida de gravedad en el sistema de coordenadas del dispositivo.

Lamentablemente, soy un experto en Swift, por lo que no puedo proporcionar un código de ejemplo, pero estás buscando proporcionar un bloque de tipo. CMAccelerometerHandler que recibirá un CMAccelerationData del cual puedes obtener CMAcceleration struct y que es, directamente, el vector de gravedad a aplicar.

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top