为什么我的NSTimers中只有一个有效?

时间:2015-03-09 02:17:02

标签: cocoa animation nstimer

我不明白为什么只有animateDarkAst动画有效。前两个定时器(在processKeys上运行的定时器和在animateDarkAst上运行的定时器)工作正常但其他定时器不合适。我写定时器的顺序并不重要,只有这两种方法适用于各自的定时器。对于其他3个动画,屏幕上不显示任何内容,因为在其方法中没有处理任何代码(animateLightAst,animateSmallAst,animateComet)。

    // Prepare asteroids.
    _asteroiddark = [[NSImageView alloc] init];
    [_asteroiddark setImage: [NSImage imageNamed:@"asteroiddark"]];
    [_asteroiddark setFrame: theModel.darkAstRect];

    _asteroidlight = [[NSImageView alloc] init];
    [_asteroidlight setImage: [NSImage imageNamed:@"asteroidwhite"]];
    [_asteroidlight setFrame: theModel.lightAstRect];

    _asteroidsmall = [[NSImageView alloc] init];
    [_asteroidsmall setImage: [NSImage imageNamed:@"asteroidsmall"]];
    [_asteroidsmall setFrame: theModel.smallAstRect];

    // ... and comets
    _comet = [[NSImageView alloc] init];
    [_comet setImage:[NSImage imageNamed:@"comet"]];
    [_comet setFrame: theModel.cometRect];




    // Set up key Processing timer for fluid spaceship movement.
    timer1 = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(processKeys) userInfo:nil repeats:YES];


    // Make a random value for first animation timer.
    double randomInterval1 = arc4random() % (4 - 1) + 1;


    // Set up key Processing timer for animation.
    timer2 = [NSTimer scheduledTimerWithTimeInterval:randomInterval1 target:self selector:@selector(animateDarkAst) userInfo:nil repeats:YES];

   double randomInterval2 = ((double)arc4random() / 3) * (3 - 1) + 1;


     timer3 = [NSTimer scheduledTimerWithTimeInterval:randomInterval2 target:self selector:@selector(animateSmallAst) userInfo:nil repeats:YES];


    double randomInterval3 = ((double)arc4random() / 5) * (5 - 1) + 1;


    timer4 = [NSTimer scheduledTimerWithTimeInterval:randomInterval3 target:self selector:@selector(animateLightAst) userInfo:nil repeats:YES];




    double randomInterval4 = ((double)arc4random() / 6) * (6 - 1) + 1;


    timer5 = [NSTimer scheduledTimerWithTimeInterval:randomInterval4 target:self selector:@selector(animateComet) userInfo:nil repeats:YES];




}
return self;
}



-(void) animateDarkAst
{
int randX = arc4random_uniform(self.bounds.size.width);

int randSize = 40 + arc4random() % (120-40+1);

CGPoint startPoint = CGPointMake(randX, self.bounds.size.height);


[_asteroiddark setFrame: NSMakeRect(startPoint.x, startPoint.y, randSize, randSize)];
[self addSubview:_asteroiddark];

// Create animation (down y-axis)
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration:1.5];

    [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    _asteroiddark.animator.frame = CGRectOffset(_asteroiddark.frame, 0, -self.bounds.size.height - 180);
} completionHandler:nil];
}


-(void) animateSmallAst
{

int randX = arc4random_uniform(self.bounds.size.width);

int randSize = 40 + arc4random() % (120-40+1);

CGPoint startPoint = CGPointMake(randX, self.bounds.size.height);


[_asteroidsmall setFrame: NSMakeRect(startPoint.x, startPoint.y, randSize, randSize)];
[self addSubview:_asteroidsmall];

// Create animation (down y-axis)
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration:1.5];

    [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    _asteroidsmall.animator.frame = CGRectOffset(_asteroidsmall.frame, 0, -self.bounds.size.height - 180);
} completionHandler:nil];
}

-(void) animateLightAst
 {
int randX = arc4random_uniform(self.bounds.size.width);

int randSize = 40 + arc4random() % (120-40+1);

CGPoint startPoint = CGPointMake(randX, self.bounds.size.height);


[_asteroidlight setFrame: NSMakeRect(startPoint.x, startPoint.y, randSize, randSize)];
[self addSubview:_asteroidlight];

// Create animation (down y-axis)
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration:1.5];

    [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    _asteroidlight.animator.frame = CGRectOffset(_asteroidlight.frame, 0, -self.bounds.size.height - 180);
} completionHandler:nil];
}

-(void) animateComet
{
int randX = arc4random_uniform(self.bounds.size.width);

int randSize = 40 + arc4random() % (120-40+1);

CGPoint startPoint = CGPointMake(randX, self.bounds.size.height);


[_comet setFrame: NSMakeRect(startPoint.x, startPoint.y, randSize, randSize)];
[self addSubview:_comet];

// Create animation (down y-axis)
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration:1.5];

    [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    _comet.animator.frame = CGRectOffset(_comet.frame, 0, -self.bounds.size.height - 180);
} completionHandler:nil];
}

我该如何处理?我可以一次没有5个计时器吗?

1 个答案:

答案 0 :(得分:0)

正确的问题是:“为什么至少有一个计时器工作?”

正如您在documentation中所看到的,方法的签名必须采用一个参数(将NSTimer的实例发送给委托)。

  

aSelector定时器触发时发送给目标的消息。

     

选择器应具有以下签名:timerFireMethod:   (包括冒号以指示该方法接受参数)。该   timer将自身作为参数传递,因此该方法将采用   以下模式:

添加计时器时更改方法和选择器的签名。