-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];
    }




}

}

コードについて説明します。

だから私はヒーローの数を取得します(何人いますか)、作りたいほど多くのモンスターがない限り、2つの連続したヒーローの間でランダムなラインを選択し、そのラインでポイントを生成します。生成されたポイントは他のものに近いです(オーバーラップしたくありません)..そうである場合はループを再開し、そうでない場合はランダムモブに追加します

モブが別のモブとオーバーラップしているかどうかを確認するとスタックします...しかし、ヒーローは常に少なくとも 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 に答える