【问题标题】:GKBehaviour in xcode 8 beta 4 makes gkagent position crazyxcode 8 beta 4 中的 GKBehaviour 让 gkagent 的位置变得疯狂
【发布时间】:2016-08-04 22:17:39
【问题描述】:

所以我正在创建一个游戏,我想为我的GKAgent 行为添加一些GKGoal

所以经过几个小时的战斗,我这次从 Apple Agents Catalog 下载了下一个项目,并且在 Xcode 7.3 中它可以工作。我将它重写为 Swift 并使用 GKGoal(toWander:) 创建基本 GKAgent 这是我的代码:

 class AAPLAgentNode: SKNode, GKAgentDelegate {
    init(withScene scene:SKScene ,radius: Float, position:CGPoint) {
        super.init()
        
        self.position = position
        self.zPosition = 10
        scene.addChild(self)
        
        agent = GKAgent2D()
        agent.radius = radius
        agent.position = vector2(Float(position.x), Float(position.y))
        agent.delegate = self
        agent.maxSpeed = 100
        agent.maxAcceleration = 50
        
        let circleShape = SKShapeNode(circleOfRadius: CGFloat(radius))
        circleShape.lineWidth = 2.5
        circleShape.fillColor = SKColor.gray
        circleShape.zPosition = 1
        self.addChild(circleShape)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    func agentWillUpdate(_ agent: GKAgent) {
        
    }
    
    func agentDidUpdate(_ agent: GKAgent) {
        self.position = CGPoint(x: Double(self.agent.position.x), y: Double(self.agent.position.y))
        print("aaa == \(self.position)")
    }
    
    var agent: GKAgent2D!
}

当我添加到场景中时

     let wanderer = AAPLAgentNode(withScene: self, radius: 100, position: CGPoint(x: 0, y: 0))
    
    wanderer.agent.behavior = GKBehavior(goal: GKGoal(toWander: 10), weight: 100)

    agentSystem.addComponent(wanderer.agent)

没有行为的位置是静态的,但是当我添加它时,位置会变得疯狂,并且在每次更新迭代中,值就像

  • 位置 == (-10051366.0, 251672512.0)
  • 位置 == (1368370.0, 259904576.0)
  • 位置 == (-131583.0, 264841120.0)

这只是 Xcode 8 测试版错误,还是我做错了什么。我花了很多时间试图解决它。 谢谢:)

【问题讨论】:

  • 我在 iPad 上使用 Swift Playgrounds 1.1.2 时遇到了类似的行为(不是双关语),x 的位置还可以,但y 总是得到毫无意义的巨大价值。 GKGoal 实现中肯定存在错误。
  • 我在 Xcode 9 中看到了相同的行为。一旦您在作为 SKNode 组件的 GKAgent2D 上设置行为,代理的委托方法就会报告代理的疯狂位置。这有效地导致 GKGoal、GKBehaviour、GKAgent 在 SpriteKit 中无法运行。不过有趣的是,我没有看到将 GKAgent3D 附加到 SceneKit 中的 SCNNodes 的这种行为。可怕的是,像这样严重的错误已经通过两个版本的 Xcode。
  • 同样的代码在 iOS 11 上也可以工作。我只是在 macOS Sierra 上看到了不稳定的行为(尚未更新到 High Sierra)。如果它已在 iOS 11 中修复,也许它已在 High Sierra 中修复?

标签: ios xcode sprite-kit tvos gameplay-kit


【解决方案1】:

我知道这已经很老了,但是您在第一次更新时是否以非常高的 deltaTime 调用?

我将系统时间作为我对代理行为的第一次更新调用进行调用,导致在第一个时间步出现大幅跳跃

【讨论】:

  • 这就是原因。 previousTime 的初始值为 0。这导致了一个巨大的初始值。将 previousTime 更改为可选项,并在 nil 成功时使用当前时间。
【解决方案2】:

试图解决这个代理,行为的东西非常令人沮丧......当我在我的 SKScene 的didMove() 方法中添加我的节点和代理时,我在 Xcode 9.0 中尝试toSeekAgent 时遇到了这个问题,但是在从touchesBegan()“初始化”它们之后,极端位置问题就消失了。

【讨论】:

  • 这也是发生在我身上的事情,所以我尝试了您的解决方案并且它有效。我不知道为什么它在 didMove() 中不起作用,但在 touchesBegan() 中起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多