Я искал способ добавить смещение к тому, как акселерометр отслеживает движение игрока в моей игре. В моей игре вы управляете персонажем игрока, наклоняя телефон вперед и назад. Это преобразуется акселерометром в координаты x и y на экране. к сожалению, это означает, что для того, чтобы персонаж не постоянно находился внизу экрана, вы должны держать телефон горизонтально. Что не очень удобно для игроков.
Итак, я пытаюсь реализовать способ, при котором любой угол телефона при запуске игрового сеанса является углом по умолчанию, а затем наклон определяется дельтой этого угла, а не необработанными данными, которые были бы против 0,0 наверное...
вот моя попытка разобраться:
func instantiateAcceleration() {
if motionManager.accelerometerAvailable{
let queue = NSOperationQueue()
motionManager.startAccelerometerUpdatesToQueue(queue) { data, error in
let currentX = self.player.position.x
let currentY = self.player.position.y
if(!self.hasCapturedOffset){
/* So the first time we enter this loop. we'll cature the offset */
self.offsetY = data!.acceleration.y;
self.offsetX = data!.acceleration.x;
print("captured offset : x - \(self.offsetX) y - \(self.offsetY)")
self.hasCapturedOffset = true;
}
/* x coords */
if data!.acceleration.y < (0 - self.offsetY) {
self.destX = currentX + CGFloat(data!.acceleration.y * 100)
}
else if data!.acceleration.y > (0 + self.offsetY) {
self.destX = currentX + CGFloat(data!.acceleration.y * 100)
}
/* y coords */
if data!.acceleration.x > (0.1 - self.offsetX){
self.destY = currentY - CGFloat(data!.acceleration.x * 100)
}
else if data!.acceleration.x < (0.1 + self.offsetX) {
self.destY = currentY - CGFloat(data!.acceleration.x * 100)
}
/* keep it in bounds */
if(self.destY > self.size.height){
self.destY = self.size.height;
}else if(self.destY < 0){
self.destY = 0;
}
if(self.destX > self.size.width){
self.destX = self.size.width;
}else if(self.destX < 0){
self.destX = 0;
}
}
} else {
print("Accelerometer is not available")
}
}
указанная выше функция вызывается для viewDidLoad, а self.DestX, self.DestY используются для обновления проигрывателя в методе обновления:
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
/* Accelerometer data */
let action = SKAction.moveTo(CGPoint(x:destX, y:destY), duration: 0.1)
self.player.runAction(action)
}
Я действительно хотел бы узнать, как это сделать правильно, я знаю, что за этим определенно стоит какая-то математика, с которой я не знаком. Если бы кто-то мог указать мне правильное направление, я был бы очень признателен:)