7

我似乎很难将我的精灵节点保持在我通过以下方式设置的地图边界内:

我有一个由 iOS 9提供的按目标和行为SKNode *enemy移动的。当前节点徘徊,并避开定义对象的障碍物。我设置了我的位掩码,以便任何障碍物都被视为类别wall,节点被告知与之碰撞(AKA 不允许通过)。SKSceneGameplayKitGKPolygonObstacle

在我的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参考,而是形状。它们就像这两个括号一样起作用:[](我的两半在中间是齐平的)。

我的问题是这样的:

  • 如何使用带有位掩码类别的物理或目标行为来防止敌人穿过这些障碍?(或两者一起)

我知道虽然 aGKGoal是建议的行为,但它并不能保证能够达到这个目标(但它可以有约 95% 的把握,它不会像Apple 的 AgentsCatalog所示的那样发生)。但是,我不明白的是,为什么敌人不会像目标告诉它(试图)“通过”这样的边界那样简单地沿着边界的边缘“滑行”。

当我在场景中手动移动敌人时,确实会发生这种“滑动”行为,并且当我试图将其移动通过被视为障碍物的边界时,它会向我让它移动的方向滑动(就像任何视频游戏一样有地图边界)。

所以

如果有人可以帮助我防止这种情况发生/解释如何防止敌人穿过这些(据说)“无法通行”的区域,我将不胜感激。

仅供参考:如果您不清楚我所描述的内容/我如何创建任何对象,请询问,我将提供更多信息以提供帮助。

4

0 回答 0