好的...所以我在一个班级中随机生成一个关卡,然后将其传递给游戏。
问题是,当我生成关卡时,它有时会陷入循环(由于我在生成关卡时所做的检查)。我试图通过修改代码来减少冻结次数。但如果出现这种情况,它仍然会卡在 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 秒 .. 或什么的