我试图用内置的加速度计使X轴球员移动,但有些地方出了问题。当我在iPhone上模拟应用程序时,节点会一直向各个方向移动,只有在我关闭应用程序并再次启动它时,节点才会从左向右移动2-3次,这正是我想要的。所以它可以工作,但只有在关闭并再次打开应用程序之后。
部分代码:
import Foundation
import SpriteKit
import CoreMotion
class Gameplay : SKScene{
private var player : Player?
var motionManager = CMMotionManager()
override func update(_ currentTime: TimeInterval) {
self.player?.move()
}
func initializeGame(){
player = childNode(withName: "player") as? Player!
player?.initPlayer()
}
override func didMove(to view: SKView) {
initializeGame()
motionManager.startAccelerometerUpdates()
motionManager.accelerometerUpdateInterval = 0.1
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data , _) in
if let accelerometerData = data{
print("x: \(accelerometerData.acceleration.x)")
print("y: \(accelerometerData.acceleration.y)")
self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.x*10, dy: 0) //only x axis?
} else {
print("NOPE")
}
}
}
玩家.swift:
import Foundation
import SpriteKit
class Player : SKSpriteNode{
func initPlayer(){
name = "Player"
physicsBody?.affectedByGravity = true
physicsBody?.isDynamic = true
}
func move(){ //boundaries
if position.x >= 315{
position.x = 315
} else if position.x <= -315{
position.x = -315
}
}
func shoot(){
//...
}
}
最佳答案
与其改变场景的重力,不如直接移动播放器。如果你调整重力,它也会把你所有其他的物理体弄乱。所以要么用SKAction移动玩家,要么对其施加一个力。
player?.physicsBody?.applyForce(CGVector(dx: 30 * CGFloat(accelerometerData.acceleration.x), dy: 0))
我还建议您不要使用处理程序进行运动更新,使用它我永远不会得到准确的结果。
所以删除这个代码块
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data , _) in
if let accelerometerData = data{
print("x: \(accelerometerData.acceleration.x)")
print("y: \(accelerometerData.acceleration.y)")
self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.x*10, dy: 0) //only x axis?
} else {
print("NOPE")
}
}
而是转到场景的更新方法并从中获取运动数据。
override func update(_ currentTime: TimeInterval) {
if let accelerometerData = motionManager.accelerometerData {
player?.physicsBody?.applyForce(CGVector(dx: 30 * CGFloat(accelerometerData.acceleration.x), dy: 0))
}
....
}
这将使一切变得更加顺利和迅速。调整30以获得所需的结果。
希望这有帮助
关于ios - 奇怪的加速度计行为(CoreMotion),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42232640/