2015-02-04 2 views
0

В моем проекте SpriteKit у меня есть метод spawnEnemy. Я хочу, чтобы этот метод вызывался снова и снова, чтобы враги продолжали появляться на протяжении всей игры.Как изменить wait for duration SKAction, выполняемый SKScene?

Что я сделал, чтобы добиться этого поставить метод spawnEnemy в SKAction runBlock и у меня SKScene бега, что действие навсегда с задержкой между вызовами (для предотвращения перегрузки приложения).

Ниже приведен фрагмент кода соответствующего кода:

var _spawnSpeedSeconds: Double = 2.0 

func startSpawning() 
{ 
    let waitForXSeconds = SKAction.waitForDuration(self._spawnSpeedSeconds) 

    let spawn = SKAction.runBlock({() -> Void in 
      self.spawnEnemy() 
     })  
    self.runAction(SKAction.repeatActionForever(SKAction.sequence([spawn, waitForXSeconds])), withKey: "spawnEnemy") 
} 

func spawnEnemy() 
{ 
... 
} 

Теперь по прошествии определенного времени (например, когда игрок получает 5 очков, или что-то), я уменьшите _spawnSpeedSeconds, чтобы сделать врагов икру более в более короткое время для увеличения сложности.

Проблема заключается в том, что, даже если я уменьшаю переменную _spawnSpeedSeconds, задержка действия икры, выполняемая SKScene, остается прежней.

Единственный способ решить эту проблему - удалить действие, а затем снова добавить действие с новой скоростью задержки/спава. Есть ли лучший способ подойти к этой проблеме?

Спасибо

+0

В настоящее время я код с Objective-C, поэтому я не смогу предоставить быстрый пример. Что я обычно делаю в этой ситуации, я создаю рекурсивный метод. В этом методе я создаю действие wait и действие, выполняющее тот же метод. Таким образом, у вас будет больше контроля над временем задержки, и вы даже можете иметь собственные условия внутри. Сообщите мне, если это неясно, и если это будет работать. –

+0

@JadFeitrouni Спасибо, что комментировали. Я думаю, что я понял, но я просто хочу убедиться, вы можете предоставить фрагмент кода? Цель-C должна быть прекрасной, так как я знаком с языком. – aresz

+0

действия имеют свойство скорости – LearnCocos2D

ответ

3

не используйте действие в этом случае. Они не работают динамично. Когда вы их установили, они застряли. просто используйте свой метод обновления.

Я покажу вам, как я периодически запускать missles:

первый набор два таймера в классе

var missleTimer:NSTimeInterval = NSTimeInterval(2) 
var missleInterval:NSTimeInterval = NSTimeInterval(2) 

сейчас в нашем методе обновления мы отсчитывать время и икру missles

// subtract time from our timer 
self.missleTimer -= self.delta 

// when our timer reaches zero 
if self.missleTimer <= 0 { 
    // run your spawning code 
    self.launchMissle() 
    // reset timer 
    self.missleTimer = self.missleInterval 
} 

Это лучше, чем использование действия в этом случае, потому что я могу установить missleInterval в любом месте моего кода, и изменение всегда будет отображаться.

1
-(void)recursiveMethod 
{ 
    if(shouldSpawnEnemy) 
    { 
     _spawnSpeedSeconds -= 0.01; 
     SKAction *wait = [SKAction waitForDuration: 0.5]; 
     SKAction *action = [SKAction performSelector:@selector(recursiveMethod) onTarget:self]; 
     SKAction *sequence = [SKAction sequence:@[wait,action]]; 
     [self repeatActionForever:sequence]; 
    } 
} 

Не забудьте вызвать рекурсивный метод, если вы хотите начать размножение врагов. Надеюсь, что помогает.