Comment changer SKAction qui fonctionne pour toujours

J'ai une séquence SKAction impliquant deux actions. 1) attendre le time en fonction de la variable 2) object spawn

SKAction *sequence = [SKAction sequence:@[ wait, addObject]]; 

cette action est définie pour s'exécuter pour toujours. cependant, je veux que la durée d'attente change en fonction de la mise à jour de la variable, mais elle rest constante car elle ne prend pas la nouvelle variable en cours d'exécution pour toujours

 [self runAction:[SKAction repeatActionForever:sequence]]; 

Comment est-ce que je le fais augmenter régulièrement la valeur, augmentant ainsi le taux de frai d'object?

Merci

Il y a deux solutions:

  1. Créez la séquence ou au less l'action d'attente à chaque fois que vous en avez besoin. Les actions sont censées être rejetées et réutilisées fréquemment.
  2. Si cela pose un problème de performances et que vous avez déjà une reference à la séquence, vous pouvez également modifier sa variable de vitesse. Cela devrait modifier le time d'attente en conséquence, c'est-à-dire que si la vitesse est de 0,5, le time d'attente devrait doubler.

Exemple pour la solution 1:

 CGFloat waitDuration = (value to be determined by you); SKAction *sequence = [SKAction sequence:@[ [SKAction waitForDuration:waitDuration], addObject]]; 

Exemple pour la solution 2:

 SKAction *sequence = [SKAction sequence:@[ wait, addObject]]; // half the speed, double the wait time sequence.speed = 0.5; // or if you need to derive speed from waitDuration (which must be >0.0) sequence.speed = (1.0 / waitDuration); 

Si la séquence n'est pas affectée par la vitesse, essayez plutôt de régler la vitesse de l'action d' wait .

J'ai donc suivi la réponse de LearnCocos2D, mais j'ai fait une légère modification qui, je pense, fonctionne très bien. Cela fonctionne pour mon but, alors j'ai pensé à le mettre là-bas.

Ce que j'ai fait était ceci:

 //This is the boring bits for creating the SKSpriteNode headsNode = [SKSpriteNode spriteNodeWithTexture:[self.textureAtlas firstObject]size:CGSizeMake(100, 100)]; headsNode.position = CGPointMake(CGRectGetMidX(self.frame)*0.5, CGRectGetMidY(self.frame)-coinSize/2); headsNode.name = @"Heads"; [self addChild:headsNode]; // I added a timer with winkWaitingTime as interval. This is the variable // to change. Set this to something at the beginning. NSTimer *timered= [NSTimer scheduledTimerWithTimeInterval:winkWaitingTime target:self selector:@selector(timerFired:) userInfo:nil repeats:YES]; [timered fire]; } -(void)timerFired:(NSTimer*)timer{ //In the NSTimer Selector, I set the timer interval / SKAction waiting interval to a random // number winkWaitingTime =[[SharedInfo sharedManager] randomFloatBetween:3 and:8]; [headsNode removeAllActions]; //I thought it's best to remove the actions JIC :) [headsNode runAction:[self returnActionForAnimationKey:headsNode.name]]; NSLog(@"winktimer: %f",winkWaitingTime); } -(SKAction*)returnActionForAnimationKey:(NSSsortingng*)animationKey{ CGFloat waitDuration; //This is for just to prevent timer fire interfering with the SKAction //This will make the SKAction waiting time shorter than NSTimer Fire rate if (winkWaitingTime >4) { waitDuration = winkWaitingTime-3; }else{ waitDuration = 1; } SKAction *sequence = [SKAction sequence:@[ [SKAction waitForDuration:waitDuration], [SKAction animateWithTextures:self.textureAtlas timePerFrame:0.1f resize:NO restore:YES]]]; return sequence; } 

Comme je l'ai dit, cela fonctionne pour moi, et en changeant le winkWaitingTime, et un peu de gestion de la prévention, ça marche.

J'espère que vous findez cela utile aussi. En termes de memory management, mon Xcode montre une utilisation CPU / memory / batterie stable, donc il n'y a pas d'augmentation de l'utilisation.

NOTE : Après avoir reçu un commentaire, j'ai pensé qu'il est préférable de discuter de l'utilisation de NSTimer . Si vous avez besoin de faire quelque chose "en externe", c'est-à-dire indépendamment de la vue ou de la scène, alors j'utiliserais le NSTimer (c'était mon cas). Mais vous devrez également mettre en pause et retarder la timer. (Vous devrez invalider le NSTimer pour l'arrêter, et en replanifier un nouveau, ou l'avoir comme variable et replanifier le même). Sinon, utilisez SKAction et vous n'aurez pas besoin de mettre en pause et de NSTimer le NSTimer .