2

私はこの新しいフレームワークについて何日も検索し、その機能のいくつかを利用しようとしましたが... 私には合わないものがいくつかあり、デモボットのソースコードはいくつかの点で役に立ちません、ある種の簡単なチュートリアルが欠けていますが、主な疑問は次のとおりです。

let obstacles = scene["obstacle"]
polygonObstacles = SKNode.obstaclesFromNodePhysicsBodies(obstacles)
graph = GKObstacleGraph(obstacles: polygonObstacles, bufferRadius: 60.0)


func drawGraph() {
    for node in graph.nodes as! [GKGraphNode2D] {
        for destination in node.connectedNodes as! [GKGraphNode2D] {
            let points = [CGPoint(node.position), CGPoint(destination.position)]
            let shapeNode = SKShapeNode(points: UnsafeMutablePointer<CGPoint>(points), count: 2)
            shapeNode.strokeColor = SKColor(white: 1.0, alpha: 0.5)
            shapeNode.lineWidth = 5.0
            shapeNode.zPosition = 3
            scene.addChild(shapeNode)
        }
    }
}

それで、このグラフを描いて接続を確認しようとすると、次のようになります 。 -画面のコーナー部分には常により多くの接続があります(半径はそれに影響しません)

私は自分のゲームで GKComponents を使用していませんが、次のように GKAgents2D を実行してプレイヤーを探してみました。

func calculateBehaviorForAgents(){

  let mainCharacterPosition = float2(scene.mainCharacter.position)
  let mainCharacterGraphNode = GKGraphNode2D(point: mainCharacterPosition)
  graph.connectNodeUsingObstacles(mainCharacterGraphNode)
  for i in 0...monsters.count-1{
     let monster = monsters[i]
     let agent = agents[i]

     let behavior = GKBehavior()

     let monsterPosition = float2(monster.position)
     let monsterGraphNode = GKGraphNode2D(point: monsterPosition)
     graph.connectNodeUsingObstacles(monsterGraphNode)

     let pathNodes = graph.findPathFromNode(monsterGraphNode, toNode: mainCharacterGraphNode) as! [GKGraphNode2D]
     let path = GKPath(graphNodes: pathNodes, radius: 00.0)

     let followPathGoal = GKGoal(toFollowPath: path, maxPredictionTime: 1.0, forward: true)
     behavior.setWeight(1.0, forGoal: followPathGoal)

     let stayOnPathGoal = GKGoal(toStayOnPath: path, maxPredictionTime: 1.0)
     behavior.setWeight(1.0, forGoal: stayOnPathGoal)

     agent.behavior = behavior

     graph.removeNodes([monsterGraphNode])
  }
  graph.removeNodes([mainCharacterGraphNode])

}

ここで updateWithDeltaTime メソッドを呼び出すと、彼のデリゲート メソッド: func agentWillUpdate(agent: GKAgent){} func agentDidUpdate(agent: GKAgent){} がエージェントの予期しない値を返します。その位置は意味をなさず、膨大な数です戦場の外へと導く

しかし、彼の速度ベクトルが理にかなっていることがわかったので、それを自分のモンスターに合わせて、エージェントをモンスターの位置に更新しました

func updateWithDeltaTime(currentTime : CFTimeInterval){

  for i in 0...monsters.count-1{

  let agent = agents[i]
  let monster = monsters[i]

  monster.physicsBody?.velocity = CGVectorMake(CGFloat(agent.velocity.x), CGFloat(agent.velocity.y))

  agent.updateWithDeltaTime(currentTime)
  agent.position = float2(monster.position)
  monster.gameSceneUpdate(currentTime)

}

今、私はいくつかの結果を得ていましたが、それは私が望むものとはかけ離れています: モンスターはキャラクターを画面の端や右上部分まで追いかけていません.フォローします(画像にはこのポイントはありませんが、存在します)。どうやらそこに通じる道がなかったので、イメージを覚えていますか?

問題は、このエージェント システムを機能させるにはどうすればよいかということです。

たぶん、エージェント、ゴール、さらにはグラフの使い方が完全に間違っています! ドキュメンテーションを読みましたが、まだ正しく作成できません。さらに... 最初は、「voidObstacles」のような GKGoals を使用しても、モンスターは同じ PolygonObstacles を通過して障害物を回避していませんでしたが、変更すると、

graph.connectNodeUsingObstacles(mainCharacterGraphNode)
graph.connectNodeUsingObstacles(monsterGraphNode)

graph.connectNodeUsingObstacles(mainCharacterGraphNode, ignoringObstacles: polygonObstacles)
graph.connectNodeUsingObstacles(monsterGraphNode, ignoringObstacles: polygonObstacles)

出来た!oO

私は本当に助けが必要です、みんなありがとう:D!

4

0 に答える 0