2010-04-23 67 views
1

我使用cocos2d在iPhone上制作游戏,并且我有一个问题。
在我的init方法我这样做:我们可以动态改变“时间表”的间隔吗?

[self schedule:@selector(newMonster:) interval:1]; 

它创建一个新的怪物每一秒。
但我希望间隔随时间变化。例如:

  • 游戏的前10秒:每1秒出现一个新怪物。
  • 然后持续10秒:每0.8秒出现一个新怪物。
  • 而每0.5秒后...

我怎么能这样做?

谢谢!

回答

1

您可能试试这个(我从@bddckr复制了一些代码)

初始时间:

self.monsterSpawnStartDate = [NSDate date]; 
self.lastTimeScheduledBefore = 0;//new var 

计划方法来创建怪物

- (void)scheduledMethod { 
    NSTimeInterval seconds = [[NSDate date] timeIntervalSinceDate:monsterSpawnStartDate]; 

    [self newMonster]; // Let a new monster spawn 
    if (seconds >= 20.0 && lastTimeScheduledBefore == 10){ 
     [self unschedule:@(scheduledMethod)]; 
     [self unschedule:@(scheduledMethod) interval:0.5]; 
     lastTimeScheduledBefore = 20; 
    } 
    else if (seconds >= 10.0 && lastTimeScheduledBefore == 0){ 
     [self unschedule:@(scheduledMethod)]; 
     [self unschedule:@(scheduledMethod) interval:0.8] 
     lastTimeScheduledBefore = 10; 
    } 
} 

您可以修改它作为您的需要。如果经过一个周期,您可以使用mod

1

将一个实例变量和NSDate的属性称为monsterSpawnStartDate,使其成为一个保留属性并将其合成。
只要你的第一个怪物应该创建,将其设置:

self.monsterSpawnStartDate = [NSDate date]; // Current date and time 

并以此替换代码:

[self schedule:@selector(adjustMonsterSpawnRate) interval:0.1]; // Seems like you want it to fire every 0.1 seconds 

实现adjustMonsterSpawnRate这样的:

- (void)adjustMonsterSpawnRate { 
    NSTimeInterval seconds = [[NSDate date] timeIntervalSinceDate:monsterSpawnStartDate]; 
    if (((seconds <= 10.0) && (seconds % 1.0)) || ((seconds <= 20.0) && (seconds % 0.8)) ((seconds > 20.0) && (seconds % 0.5))) 
     [self newMonster]; // Let a new monster spawn 
} 
0

我想一个更好的选择是使用预定函数用于计时,并使用累计时间触发敌人创建如下

self.time_since_last_monster = 0 [自时间表:@selector(new_monster :)间隔:0.3];

-(void) new_monster:(ccTime)dt{ 
    self.time_since_last_monster += dt; 
    if(self.time_since_last_monster > monster_interval){ 
      self.time_since_last_monster -= monster_interval; 
      [self create_new_monster]; 
      // at this point based on some condition, you can now change monster_interval 
    } 
} 

这会给予更多的灵活性。

0

我很愚蠢的,所以这里就是我想要做的:在

。h设定一个浮动

float nextMonsterIn; 

然后在体内

nextMonsterIn = 1.0; 
[self scheduleOnce:@selector(newMonster:) interval:nextMonsterIn]; 
[self schedule:@selector(kickUpDifficulty:) interval:10]; 

- (void) newMonster : (ccTime) dt 
{ 
    [self scheduleOnce:@selector(newMonster:) interval:nextMonsterIn]; 
    //-----make a monster----- 
} 

- (void) kickUpDifficulty : (ccTime) dt 
{ 
     if(nextMonsterIn == 1.0) 
      nextMonsterIn = 0.8; 
     else if(nextMonsterIn == 0.8) 
     { 
      nextMonsterIn = 0.5; 
      [self unschedule:@selector(kickUpDifficulty:)]; 
     } 
} 

基本上每次我打电话newMonster时间我会递归地重新安排根据我目前的延迟newMonster,那么我可以调整延迟定时器或每次怪物被杀或任何地方。

相关问题