/ / El acelerómetro SpriteKit no siempre es preciso o puede ser demasiado sensible: swift, sprite-kit, swift3

El acelerómetro SpriteKit no siempre es exacto o quizás demasiado sensible: swift, sprite-kit, swift3

Estoy implementando movimiento en mi juego usando el siguiente código:

if motionManager.isAccelerometerAvailable == true {

    motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: {

data, error in

let currentX = self.player.position.x

self.destX = currentX + CGFloat((data?.acceleration.x)! * 200)

})

}

Luego, en la función de actualización (_ currentTime: CFTimeInterval):

let action = SKAction.moveTo(x: destX, duration: 0.2)

self.player.run(action)

El problema es que parece muy sensible yel sprite a veces va en sentido contrario a su inclinación y simplemente parece estar por todas partes, creo que tiene que ver con la inclinación del dispositivo, solo quiero detectar el movimiento de lado a lado. ¿Me estoy perdiendo de algo?

Respuestas

0 para la respuesta № 1

Intentaría obtener sus datos de movimiento directamente enEl método de actualización de su escena, por lo que se actualiza 60 veces por segundo. Nunca obtuve buenos resultados con el controlador, siempre es lento, incluso si configura el intervalo muy bajo.

override func update(_ currentTime: TimeInterval) {
if let data = motionManager.accelerometerData {
let currentX = player.position.x
destX = currentX + CGFloat((data.acceleration.x) * 200)
...
}
}

Puede que tenga que ajustar el 200 para obtener elresultado deseado. También reduciría la duración de SKAction, 0.2 es demasiado largo. Alternativamente, intente actualizar su posición de Sprite directamente sin usar un SKAction.

Espero que esto ayude


0 para la respuesta № 2

Creo que te estás perdiendo la otra parte del tutorial que probablemente estés recibiendo este código desde aquí: https://www.ioscreator.com/tutorials/move-sprites-accelerometer-spritekit-swift en el sentido de que siente la necesidad de manejar los datos negativos de una manera extraña:

        let currentX = self.player.position.x

if data.acceleration.x < 0 {
self.destX = currentX + CGFloat(data.acceleration.x * 100)
}

else if data.acceleration.x > 0 {
self.destX = currentX + CGFloat(data.acceleration.x * 100)
}

Y la pista de por qué esto podría ser un problema, y ​​todo el "tutorial" un sueño miope, es que está usando la creación de SKActions en la actualización () para impulsar el movimiento.

Eso no parece correcto, en absoluto.

Hay otras dos buenas formas de mover cosas, con datos de movimiento:

  1. Aplique fuerzas que reflejen el ángulo del dispositivo sobre el objeto.
  2. Cambia la dirección y la fuerza de la gravedad que afecta al objeto según el ángulo del dispositivo

Consideraría que ambos son muy superiores a la técnica de Acción de responder a la información de movimiento, pero podría estar equivocado al respecto.