Я искал способ добавить смещение к тому, как акселерометр отслеживает движение игрока в моей игре. В моей игре вы управляете персонажем игрока, наклоняя телефон вперед и назад. Это переводится акселерометром на координаты x и y на экране. к сожалению, это означает, что для того, чтобы остановить персонажа от постоянного присутствия в нижней части экрана, вы должны держать телефон плоским. Что не очень удобно для игроков.Быстрая настройка отслеживания акселерометра с CMMotionManager
Таким образом, я пытаюсь реализовать способ, которым независимо от угла телефона, когда он начинает сеанс игры, то есть угол по умолчанию, а затем угол наклона определяется дельтами этого угла, а не сырой данные, которые были бы против 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")
}
}
что выше FUNC называется на 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)
}
Мне бы очень хотелось узнать, как это сделать должным образом, я знаю, что за этим стоит определенная математика, что я не знаком. Если кто-то может мне точку в правильном направлении, я бы очень признателен :)
большое спасибо! Я попытаюсь приспособить этот подход к моему коду – agovan
Возможно, глупый вопрос, но я полагаю, что массив float, который вы создаете для lastvector, имеет значения x, y, z в этом порядке? Так что, если бы я мог отвлечься от этого, я бы создал экземпляр MotionManger в viewDidLoad, а затем вызвал lastVector и вычислил свою позицию каждый галочку в обновлении? – agovan