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