【发布时间】:2015-12-03 22:33:40
【问题描述】:
我一直在寻找一种方法来为加速计在我的游戏中跟踪玩家移动的方式添加偏移量。 在我的游戏中,你通过前后倾斜手机来控制玩家角色。这由加速度计转换为屏幕上的 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")
}
}
上面的func在viewDidLoad上被调用,self.DestX,self.DestY在update方法中用于更新播放器:
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)
}
我真的很想学习如何正确地做到这一点,我知道这背后肯定有一些我不熟悉的数学。如果有人能指出我正确的方向,我将不胜感激:)
【问题讨论】:
标签: ios swift sprite-kit swift2.1