首页 文章

GameplayKit GKGoal:无法上班徘徊

提问于
浏览
2

试图学习如何使用 GameplayKit,特别是代理和行为。尝试将所有教程和示例归结为一小段简单的代码,我可以将其用作我自己的应用程序的起点。不幸的是,我提出的不能正常工作,我无法弄清楚原因。它只是一个带有简单 GKGoal(toWander:)的简单精灵。而不是徘徊,它只是直线向右移动,永远。尽管我将最大速度和加速度设置为可笑的高值,但它也开始不可能缓慢而且速度不可能慢。我无法弄清楚我的简单代码和所有复杂的例子之间的根本区别。这是代码,减去required init?(coder aDecoder: NSCoder)

class GremlinAgent: GKAgent2D {
    override init() {
        super.init()

        maxAcceleration = 100000
        maxSpeed = 1000000
        radius = 20
    }

    override func update(deltaTime seconds: TimeInterval) {
        super.update(deltaTime: seconds)
        let goal = GKGoal(toWander: 100)
        behavior = GKBehavior(goal: goal, weight: 1)
    }
}

class Gremlin: GKEntity {
    let sprite: SKShapeNode

    init(scene: GameScene) {
        sprite = SKShapeNode(circleOfRadius: 20)
        sprite.fillColor = .blue

        scene.addChild(sprite)

        super.init()

        let agent = GremlinAgent()
        addComponent(agent)

        let node = GKSKNodeComponent(node: sprite)
        addComponent(node)
        agent.delegate = node
    }
}

在 GameScene.swift,didMove(to view:)

let gremlin = Gremlin(scene: self)
entities.append(gremlin)

谁能帮我吗?

1 回答

  • 3

    正如已经指出别处,你必须设定目标的重量非常高。尝试 100,甚至 1000,并注意行为的差异。但即使使用这些较大的权重,您的示例中仍然存在问题:maxSpeed值。你不能把它设置得这么高,否则你的精灵就会直线飞起来。将其设置为更接近您在GKGoal对象中设置的速度的值。

    另请注意,漫游将始终以精灵指向的方向开始,因此如果您不希望它始终向右移动,请将zRotation设置为某个随机值。

    最后,不要在每次调用update()时创建新行为。对于游荡,你可以在init()中设置一次。

    这里有一些有用的代码:

    class GremlinAgent: GKAgent2D {
        override init() {
            super.init()
    
            maxAcceleration = 100000
            maxSpeed = 100
    
            let goal = GKGoal(toWander: 100)
            behavior = GKBehavior(goal: goal, weight: 1000)
        }
    }
    
    class Gremlin: GKEntity {
        let sprite: SKShapeNode
    
        init(scene: GameScene) {
            sprite = SKShapeNode(circleOfRadius: 20)
            sprite.fillColor = .blue
            sprite.zRotation = CGFloat(GKRandomDistribution(lowestValue: 0, highestValue: 360).nextInt())
    
            scene.addChild(sprite)
    
            super.init()
    
            let agent = GremlinAgent()
            addComponent(agent)
    
            let node = GKSKNodeComponent(node: sprite)
            addComponent(node)
            agent.delegate = node
        }
    }
    

相关问题