2016-02-01 52 views
2

我有一个NSArray,其名称为SKSpriteNodes,添加到我的场景中。他们是NSString。在DoWhile条件下迭代一个NSArray

我每次触发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

我相信,这将做到这一点:

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); 
+0

完美,谢谢。一个普遍的问题,你认为有更好的办法...在一个单独的方法,并从这个做的内部调用它? – Septronic

+0

@Septronic我只会这样做,如果我在其他地方使用代码,否则它什么都没有实现。 – trojanfoe

+0

是的,我同意。我正在考虑一些类或类似的东西来处理相关的方法,比如组合器类。 – Septronic