次の方法で設定したマップ境界内にスプライト ノードを保持するのが難しいようです。
iOS 9のおかげで、目標と動作によってSKNode *enemy
動き回る があります。現在、ノードはさまよい、定義されたオブジェクトである障害物を回避します。ノードが衝突するように指示されたカテゴリwallと見なされるように、ビットマスクを設定しました(別名、通過を許可しません)。SKScene
GameplayKit
GKPolygonObstacle
私didBeginContact:(SKPhysicsContact *)contact
はこれらの衝突を処理しています。すべてが計画どおりに機能しており、この敵を手動で動かしても問題はありません。
しかし、問題は、敵がシーンの周りをうろついているときに始まりますSKGoal *wanderGoal
。
// Low --> 0.5 Lowest --> 0.25
enemy.wanderGoal = [GKGoal goalToWander:low];
[enemy.agent.behavior setWeight:lowest forGoal:enemy.wanderGoal];
// Add obstacles to avoid for each of the inner map nodes
// that act as impassible areas for the enemy to pass through.
NSArray *obstacles = [SKNode obstaclesFromNodePhysicsBodies:innerMapArray];
/** This goal does not change --> enemies will ALWAYS
avoid the obstacles in the level map. This should always
be set to the highest priority of the enemy goals
*/
enemy.avoidGoal = [GKGoal goalToAvoidObstacles:obstacles maxPredictionTime:10];
// Highest --> 250
[enemy.agent.behavior setWeight:highest forGoal:enemy.avoidGoal];
敵は予想どおりランダムに移動し、ほとんどの場合障害物を回避しているように見えますが、敵が実際にマップ バリアを通過する場合があります。これについて詳しく説明します。
マップ バリアは基本的に長方形で、この形状の左半分と右半分を表すシェルとして機能する 2 つのノードを設定しました。これらのノードの太さは 100 ポイントであるため、単なるCGPath
参照ではなくシェイプです。それらは、これらの 2 つのブラケットが機能するのと同じように機能します: [] (私の半分は真ん中で平らに接触しています)。
私の質問は次のとおりです。
- ビットマスク カテゴリの物理演算またはゴール ビヘイビアを使用して、敵がこれらの障害物を通過するのを防ぐにはどうすればよいですか? (または両方一緒に)
a は推奨される動作ですが、この目標が達成されることを保証するGKGoal
ものではないことを理解しています (ただし、 Apple の AgentsCatalogが示すように、それが起こらないことは ~ 95% である可能性があります)。しかし、私が理解していないのは、ゴールがそのような境界を「通過する」ように(しようとする)ように指示するときに、敵が境界の端に沿って単に「滑る」だけではない理由です。
この「スライド」動作は、手動で敵をシーン内で動かしたときに発生します。障害物と見なされる境界を越えて移動しようとすると、移動させている方向に向かってスライドします (他のビデオゲームと同じように)マップの境界があります)。
それで
誰かがこれを防ぐのを手伝ってくれたり、敵がこれらの(おそらく)「通行不能」エリアを通過するのを防ぐ方法を説明したりできるなら、私は最も感謝しています.
参考までに:私が何を説明しているのか、どのようにオブジェクトを作成したのかが不明な場合は、質問してください。役立つ情報を提供します。