1

こんにちは、cocos2d でゲームを作っています。でランダム オブジェクトを作成したいと考えていますNSTimer。オブジェクトはNSArray.I'mに次の方法で保存されますが、タイマーが初期化されるたびに同じことが起こっています。ランダムが機能しない場合と同じように。私は変わり者です。何がおかしいのか教えていただけると幸いです。または、配列のランダム オブジェクトにアクセスする方法を教えてください。

   -(id)init{
        if (self = [super init]) {
                         ....
                     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(randomObjects) userInfo:nil repeats:NO];
                         ....
    }
    return self;
}
-(void)randomObjects{

    if (!isPaused) {
        srand(time(NULL));
        int randomObjectIndex = rand()%self.ObjectCount_forThisLevel;
        NSLog(@"randomObjectIndex = %d",randomObjectIndex);
        int randomObjectID = [[self.arrayForObjects objectAtIndex:randomObjectIndex] intValue];
        NSLog(@"randomObjectID = %d",randomObjectID);
        switch (randomObjectID) {
            case kBoxObject:{
                srand(time(NULL));
                int x1 = rand()%200+100;
                [self createBoxAtLocation:CGPointMake(x1, 500)];
                break;
            }
            case kBrickObject:{
                srand(time(NULL));
                int x2 = rand()%200+100;
                [self createBrickAtLocation:CGPointMake(x2, 500)];
                break;
            }
            case kOrangeObject:{
                srand(time(NULL));
                int x3 = rand()%200+100;
                [self createOrangeAtLocation:CGPointMake(x3, 500)];
                break;
            }
            case kBoardObject:{
                srand(time(NULL));
                int x4 = rand()%200+100;
                [self createBoardAtLocation:CGPointMake(x4, 500)];
                break;
            }
            default:
                break;
        }
    }
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(randomObjects) userInfo:nil repeats:NO];
}
4

2 に答える 2

3

cocos2d では、主に組み込みの一時停止/再開機能の影響を受けないため、NSTimer は推奨されません。代わりに、次のようにメソッドをスケジュールします。

[self schedule:@selector(randomObjects:) interval:1.0f];

また、randomObjects 定義を次のように変更する必要があります。

-(void)randomObjects:(ccTime)dt

ここで、dt は実際に経過した時間です。

最後に、rand() を使用する代わりに、次を使用します。

arc4random()

この関数は自動的にシードするため、毎回シードすることを心配する必要はありません。

于 2013-04-18T21:12:44.537 に答える