1

嗨,我正在用 cocos2d 制作游戏。我想用NSTimer. 对象存储在一个NSArray。我使用以下方式,但每次计时器初始化时都会发生同样的事情。就像随机不起作用一样。我感觉不妥。如果你能告诉我哪里出了问题,我会很高兴。或者简单地告诉我如何访问数组的随机对象。

   -(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 回答
0

首先确保您的计时器是从 init 方法调用的。使用断点查看程序是否停在那里。

其次,将“repeats”参数设为“YES”以不断获取随机对象:

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(randomObjects) userInfo:nil repeats:YES];

如果它没有被调用,您可能希望将其移动到视图控制器的生命周期方法,例如:

- (void)viewDidLoad {
[super viewDidLoad];
[self setTimer:[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(randomObjects) userInfo:nil repeats:YES]];
}

第三,从“randomObjects”方法中删除定时器调用——你可能不想每次都重新创建定时器。

要访问随机索引,请尝试使用 arc4random()

arc4random() % 4

将生成 0、1、2 或 3

同样,如果你有一个数组,并且想从中访问随机对象,你可以这样做:

NSInteger index = arc4random() % [[self arrayForObjects] count]
YourObject* object = [self arrayForObjects][index];

如果您希望计时器停止重复,只需调用:

[timer invalidate];

试试看。

于 2013-04-18T16:42:39.230 回答