gpt4 book ai didi

ios - 奇怪的加速度计行为(CoreMotion)

转载 作者:行者123 更新时间:2023-11-28 15:51:35 24 4
gpt4 key购买 nike

我试图使用内置加速度计在 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 移动玩家,要么更好地对其应用 Force。

 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))
}
....
}

这将使一切变得更加顺畅和响应 swift 。调整 30 以获得所需的结果。

希望对你有帮助

关于ios - 奇怪的加速度计行为(CoreMotion),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com