swift - 游戏套件 : NPC element is going to very high floating number coordinates and back on update

标签 swift macos

我已经插入了我的 GKBehavior/GKAgent2D/GKComponent 系统来执行一些行为例程,但在修复这个我无法弄清楚的错误时遇到了麻烦。 我先来描述一下: 我当前的实体/组件系统基于苹果的 ECS,其中: 1-entitymanager:GKEntity 管理所有组件并包含游戏中的所有实体,并使用 updateWithDelta 进入所有 GKComponentSystems,这些 GKComponentSystems 本身会更新其系统中的每个组件。 目前,更新顺序如下: 行为>节点>玩家节点>声音>界面>物理 2-每个系统都是一个 GKComponentSystem,负责更新其中的所有元素。 我有两个名为 GameRenderer 和 GameControls 的 NSViewController 扩展,它们都是 SCNSceneRendererDelegate 的代表,还有一个名为 KBAndTouchDelegate 的自定义协议(protocol),它们分别更新屏幕和控件上的渲染(一旦我的订单更新感觉正确,将更改它以将其合并到 ECS 中)。 现在,在行为组件系统中,它更新一个 MoveComponent,其中包含一些用于更新的函数(willUpdate 和 didUpdate)。两者都有一个 2DAgent 位置,该位置首先取自 SCNNode 的位置(从 SCNVector3 转换为 Float2,仅更改 x 和 z 坐标),然后在评估行为算法后反射回节点。 以下是更新的片段:

    func agentWillUpdate(agent: GKAgent) {
        guard let nodeComponent = entity?.componentForClass(SCNNodeComponent.self)
            else{
                return
        }
        let nodePos = nodeComponent.node.position
        position = float2(Float(nodePos.x), Float(nodePos.z))

    }

    func agentDidUpdate(agent: GKAgent) {
        guard let nodeComponent = entity?.componentForClass(SCNNodeComponent.self)
            else{
                return
        }
        let pos = SCNVector3(x: CGFloat(position.x), y: nodeComponent.node.position.y, z: CGFloat(position.y))
        print("\(nodeComponent.node.name) changed to \(pos)")
        nodeComponent.node.position = pos
    }

@override updateWithDeltaTime 例程检查 moveComponent 所有者所在的一方,并将其放入数组中以获得最近的敌人距离并返回敌人。 该行为具有非常低的 maxSpeed 和 maxVelocity 因子。 运行该应用程序,我打印了两个节点的一组 Action ,这两个节点是敌人并监视彼此的位置。敌人的搜索程序运行良好,因为它们以交替的顺序反射(reflect)彼此的位置。结果如下:

Optional("zombie") changed to SCNVector3(x: -20.0, y: 0.0, z: -20.0)
enemy position is: (0.0, 0.0)
Optional("player") changed to SCNVector3(x: 0.0, y: 0.0, z: 0.0)
enemy position is: (-20.0, -20.0)
Optional("zombie") changed to SCNVector3(x: -20.0, y: 0.0, z: 41567.44140625)
enemy position is: (0.0, 0.0)
Optional("player") changed to SCNVector3(x: 0.0, y: 0.0, z: 0.0)
enemy position is: (-20.0, 41567.44140625)
HRTF loaded
Optional("zombie") changed to SCNVector3(x: 30.136764526367188, y: 0.0, z: -20.2421875)
enemy position is: (0.0, 0.0)
Optional("player") changed to SCNVector3(x: 0.0, y: 0.0, z: 0.0)
enemy position is: (30.1367645263672, -20.2421875)
Optional("zombie") changed to SCNVector3(x: -38636.87109375, y: 0.0, z: 15289.939453125)

如果查看“僵尸”的第一个位置,您会发现它从 -20 开始,-20 然后 x 和 z 位置都达到不可能的大值(同样,场景世界中的 x 和 z)。玩家不会移动,因为我没有使用任何控件,只是为了看看僵尸是否能够通过以下 GKBehavior 调用找到玩家

    init(targetSpeed: Float, seek: GKAgent, avoid: [GKAgent]){
        super.init()

        if targetSpeed>0{
            setWeight(0.1, forGoal: GKGoal(toReachTargetSpeed: targetSpeed))
setWeight(0.5, forGoal: GKGoal(toSeekAgent: seek))
setWeight(1.0, forGoal: GKGoal(toAvoidAgents: avoid, maxPredictionTime: 1.0))
    }
    }

上述行为在 MoveComponent 中为僵尸的敌人(玩家)调用。这意味着僵尸会寻找玩家。 谁能告诉我 x 和 z 的这些巨大值到底是什么?僵尸和玩家的距离约为 sqrt(800) 或 28 米。但是僵尸在 x 上移动到 35800 米之外,然后切换回大约 50 米,然后在每一帧来回移动。 有一个明确的模式,我不确定这个 GKBehavior 是否使用 A 星,此时概率路线图设置了一些非常奇怪的坐标样本,但我的代码中没有任何标量可以将僵尸移动这么远并将距离翻转回来每一帧都相当正常。

最佳答案

对于任何可能遇到相同问题的人,截至昨天 2016 年 3 月 21 日,Apple 已通过最新的 x-code 7.3 公开更新解决了该问题。

关于swift - 游戏套件 : NPC element is going to very high floating number coordinates and back on update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35782773/

相关文章:

mysql - Mac Os rake 数据库 :create through error with qt and mysql dependence

java - Mac OS Yosemite 上缺少 JDK 1.8 虚拟机

macos - MAMP PEAR 配置指向本地目录

macos - 在 Mac OS 中专注于应用程序的键盘快捷键

ios - 如果我导入 Firebase,是否还包括 FirebaseAuth 和 FirebaseDatabase?

ios - 如何使用 Alamofire 创建 post 方法 cURL 请求来实现 API?

ios - 如何让 UISearchController 与 UISearchBar Interface Builder 控件一起工作?

ios - reloadData 没有调用 cellForRowAtIndexPath

iOS,初始化 GMSPlacesClient 时出错 - 无法识别的选择器发送到实例

python - 在OSX Yosemite上为Python 2.7安装OpenCV时出错-错误:无匹配功能