好的......所以我会在课堂上随机生成一个级别,然后将其传递给游戏。
问题在于,当我生成关卡时,它有时会卡在循环中(由于我生成它时的检查)。我试图通过修改代码来减少冻结次数。但如果是这样的话,它仍然会被卡在1~2%之内。
在RandomLevel中的我有这个:
-(void)positionMonsters:(int)nrM{
int nrH=[randomHero count];
int rdm;
CGPoint randPt;
BOOL is;
while ([randomMonsters count]!=nrM) {
rdm=arc4random()%(nrH-1);
if (rdm!=nrH-1) {
randPt=random_on_line([[randomHero objectAtIndex:rdm]position], [[randomHero objectAtIndex:rdm+1]position ], CCRANDOM_0_1());
}else{
randPt=random_on_line([[randomHero objectAtIndex:rdm]position], [[randomHero objectAtIndex:0]position ], CCRANDOM_0_1());
}
is=NO;
for (Monster *mob in randomMonsters) {
if (ccpFuzzyEqual(randPt, mob.position, 40)) {
is=YES;
break;
}
}
if (!is) {
Monster *mob=[[Monster alloc]initWithPosition:randPt];
[randomMonsters addObject:mob];
}
}
}
让我引导您完成代码:
所以我得到了英雄的数量(那里有多少),只要没有我想要制作的怪物,我选择了两个连续英雄之间的随机线并在该线上生成一个点,然后我检查生成的点是否接近任何其他(我不想重叠)..如果是,那么它再次开始循环,如果它不是我将它添加到随机小怪
当我检查怪物是否与另一个重叠时,它会被卡住......但是我不应该因为这些英雄总是至少相隔200 px而且我只会制造一小群怪物。在我的GameScene中,我这样做:
-(id)init{
//stuff stuff
RandomLevel *rlv=[[RandomLevel alloc]initWithHeros:6 andMonsters:6]; *****
heros=rlv.randomHeros;
mobs=rlv.randomMonsters;
}
我想要的是停止/取消*****
行并尝试再次获得一个随机级别...正如我所说的......这只发生了1%的情况所以它不会如果游戏"冻结"那就太大了每周2秒..或某事
答案 0 :(得分:1)
如果处理时间超过0.5秒,这样的事情就会突破你的循环。当然,您可以根据具体情况对其进行修改。
NSDate* myTime= [NSDate date];
while (true)
{
...
if ([myTime timeIntervalSinceNow] < -0.5])
{
break;
}
}
答案 1 :(得分:1)
你可以使用performSelector:withDelay
并在循环中取消它吗?