在DoWhile条件下迭代NSArray

时间:2016-02-01 16:55:56

标签: loops sprite-kit do-while skspritenode

我有一个NSArray,我添加到我的场景中的SKSpriteNodes的名称。他们是NSString。

每次触发nstimer时我都会生成一个随机CGPoint,以便生成下一个精灵的位置。我使用以下代码:

-(CGPoint) newLocationForPurpose{
    //
    CGFloat randomX,randomY,xMax,xMin,yMax,yMin;
    CGFloat halfSize;
    halfSize= 20.f;
    xMax = self.frame.size.width-halfSize;
    xMin =halfSize;
    yMax = self.frame.size.height-halfSize;
    yMin = halfSize;

    randomX = [[SharedInfo sharedManager] randomFloatBetween:xMin and:xMax];
    randomY = [[SharedInfo sharedManager] randomFloatBetween:yMin and:yMax];

    return CGPointMake(randomX, randomY);

}

但是,我想检查点是否在先前绘制的精灵中。

我想做的是:

do {
    randomX = [[SharedInfo sharedManager] randomFloatBetween:xMin and:xMax];
    randomY = [[SharedInfo sharedManager] randomFloatBetween:yMin and:yMax];
} while (
         ! for (NSString *name in alreadyIngame) {
    SKNode *node = [self childNodeWithName:name];
    CGRectContainsPoint(node.frame, CGPointMake(randomX, randomY));
}
         );

现在,我知道我的条件部分(一段时间之后的括号)不起作用,但这就是我想要做的事情。它将遍历alreadyInGame数组中的每个字符串(每次大约2-3个节点,赢得很多),并检查新生成的点是否在任何先前制作的精灵中。

我在考虑先制作循环,但效率并不高。我可以有一个布尔值,如果循环的结果是假的(即数组中存在点)再次进行随机化。

您认为还有其他方式吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

我相信这样做会:

CGFloat randomX, randomY;
BOOL unique = NO;
do {
    randomX = [[SharedInfo sharedManager] randomFloatBetween:xMin and:xMax];
    randomY = [[SharedInfo sharedManager] randomFloatBetween:yMin and:yMax];
    unique = YES;
    for (NSString *name in alreadyInGame) {
        SKNode *node = [self childNodeWithName:name];
        if (CGRectContainsPoint(node.frame, CGPointMake(randomX, randomY))) {
            unique = NO;
            break;
        }
    }
} while (!unique);