在 DoWhile 条件下迭代 NSArray
Iterate an NSArray in a DoWhile Condition
我有一个 NSArray,其中包含我添加到场景中的 SKSpriteNode 的名称。它们是 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));
}
);
现在,我知道我的条件部分(while 之后的括号)不起作用,但这是我想做的事情。它会遍历 alreadyInGame 数组中的每个字符串(每次大约有 2-3 个节点,不会很多),并检查新生成的点是否在任何先前制作的精灵中。
我想先做循环,但效率不高。我可以有一个布尔值,如果循环的结果为假(即点存在于数组中)再次进行随机化。
您认为还有其他方法吗?
非常感谢
我相信这会做到:
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);
我有一个 NSArray,其中包含我添加到场景中的 SKSpriteNode 的名称。它们是 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));
}
);
现在,我知道我的条件部分(while 之后的括号)不起作用,但这是我想做的事情。它会遍历 alreadyInGame 数组中的每个字符串(每次大约有 2-3 个节点,不会很多),并检查新生成的点是否在任何先前制作的精灵中。
我想先做循环,但效率不高。我可以有一个布尔值,如果循环的结果为假(即点存在于数组中)再次进行随机化。
您认为还有其他方法吗?
非常感谢
我相信这会做到:
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);