2016-02-01 69 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