わかりました...だから、クラスでレベルをランダムに生成してから、それをゲームに渡します。
問題は、レベルを生成すると、ループでスタックすることがあります (生成時に行うチェックのため)。コードを修正してフリーズ回数を減らそうとしましたが、それでも 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];
}
}
}
コードについて説明します。
だから私はヒーローの数を取得します(何人いますか)、作りたいほど多くのモンスターがない限り、2つの連続したヒーローの間でランダムなラインを選択し、そのラインでポイントを生成します。生成されたポイントは他のものに近いです(オーバーラップしたくありません)..そうである場合はループを再開し、そうでない場合はランダムモブに追加します
モブが別のモブとオーバーラップしているかどうかを確認するとスタックします...しかし、ヒーローは常に少なくとも 200 ピクセル離れており、モブを一握りしか作成しないため、そうすべきではありません。
私のGameSceneで私はこれを行います:
-(id)init{
//stuff stuff
RandomLevel *rlv=[[RandomLevel alloc]initWithHeros:6 andMonsters:6]; *****
heros=rlv.randomHeros;
mobs=rlv.randomMonsters;
}
私が望んでいるのは、*****
ラインを停止/キャンセルして、もう一度ランダムなレベルを取得しようとすることです....私が言ったように..これはケースの1%しか発生しないので、ゲームが「フリーズしても大したことではありません. "毎週2秒間..または何か