如何防止swift精灵套件中的产卵重叠?

时间:2015-06-27 16:26:24

标签: swift sprite-kit

如果我试图在屏幕的两个定义区域(顶部和底部,中间部分,它们无法生成)中的敌人中产卵,我该如何防止它们产生于或者太靠近了。

我的精灵在屏幕上相对较小,我在这里找到的唯一建议是创建一系列可能的位置,每次使用其中一个位置都将其从列表中删除,但首先所有我都不知道怎么会看起来,其次我有很多可能的位置,因为我正在使用5px高精灵,我希望他们能够重生一旦该区域清晰。

我选择顶部或底部的方法只是选择一个随机数1或2,并且取决于我有2个函数可以使它们位于顶部或底部。

我只需要没有2个物体彼此产生球的直径。任何想法如何将其纳入我的产卵?

编辑:

  //Create your array and populate it with potential starting points
   var posArray = Array<CGPoint>()
   posArray.append((CGPoint(x: 1.0, y: 1.0))
   posArray.append((CGPoint(x: 1.0, y: 2.0))
   posArray.append((CGPoint(x: 1.0, y: 3.0))

   //Generate an enemy by rolling the dice and 
   //remove its start position from our queue
   let randPos = Int(arc4random()) % posArray.count
   posArray[randPos]
   posArray.removeAtIndex(randPos)

   ...

   //Play game and wait for enemy to die
   //Then repopulate the array with that enemy's start position
   posArray.append(enemyDude.startPosition)

这是我发现的建议,但这会产生错误&#34;预期的分隔符&#34;我真的不知道如何修理。

实际上,我必须在X和Y上覆盖所有区域制作一大堆可能的位置,或者有更好的方法来做到这一点吗?

1 个答案:

答案 0 :(得分:2)

使用intersectsNode(_ node: SKNode) -> Bool

,不会在另一个节点之上产生节点

至于产卵太近,这是另一个故事。唯一可行的方法是将数组中的所有当前节点都枚举,枚举数组并将每个节点的位置检查为生成节点的位置。根据您的参数,您可以生成或不生成。

我不熟悉Swift,所以你必须自己翻译代码。

-(void)testMethod {

    // an array with all your current nodes
    NSMutableArray *myArray = [NSMutableArray new];

    // the potential new spawn node with the proposed spawn position
    SKSpriteNode *mySpawnNode = [SKSpriteNode new];

    BOOL tooClose = NO;

    // enumerate your node array
    for(SKSpriteNode *object in myArray) {

        // get the absoulte x and y position distance differences of the spawn node
        // and the current node in the array
        // using absolute so you can check both positive and negative values later
        // in the IF statement
        float xPos = fabs(object.position.x - mySpawnNode.position.x);
        float yPos = fabs(object.position.y - mySpawnNode.position.y);

        // check if the spawn position is less than 10 for the x or y in relation
        // to the current node in the array
        if((xPos < 10) || (yPos < 10))
        tooClose = YES;
    }

    if(tooClose == NO) {
        // spawn node
    }
}

请注意,该数组应该是一个属性,而不是在我在示例中使用它的范围中声明。