-1

好的...所以我在一个班级中随机生成一个关卡,然后将其传递给游戏。

问题是,当我生成关卡时,它有时会陷入循环(由于我在生成关卡时所做的检查)。我试图通过修改代码来减少冻结次数。但如果出现这种情况,它仍然会卡在 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 像素,而我只制作了少数暴徒。

在我的 GameScene 中,我这样做:

-(id)init{
//stuff stuff
RandomLevel *rlv=[[RandomLevel alloc]initWithHeros:6 andMonsters:6]; *****

heros=rlv.randomHeros;
mobs=rlv.randomMonsters;
}

我想要的是停止/取消*****线路并尝试再次获得随机水平......正如我所说......这只发生在1%的情况下,所以如果游戏“冻结”就没什么大不了了" 每周 2 秒 .. 或什么的

4

2 回答 2

1

如果处理时间超过 0.5 秒,这样的事情就会脱离你的循环。当然,您会根据您的具体情况对其进行修改。

NSDate* myTime= [NSDate date];
while (true)
{
   ...

   if ([myTime timeIntervalSinceNow] < -0.5])
   {
       break;
   }
}
于 2012-06-26T17:44:44.833 回答
1

performSelector:withDelay如果在它结束之前,您可以在循环中使用和取消它吗?

于 2012-06-26T18:04:06.420 回答