Кто-нибудь знает способ в Sprite Kit повторять действие в каждом кадре, используя счетчик? Я надеялся, что приведенный ниже пример сработает, но все повторения происходят в одном и том же цикле обновления.
SKAction *helloAction = [SKAction runBlock:^{
NSLog(@"HELLO!");
}];
SKAction *repeatBlock = [SKAction repeatAction:helloAction count:10];
[self runAction:repeatBlock];
ВЫВОД:
[14972:70b] -[MyScene update:]
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] HELLO!
[14972:70b] -[MyScene update:]
[14972:70b] -[MyScene update:]
[14972:70b] -[MyScene update:]
[14972:70b] -[MyScene update:]
В качестве альтернативы я посмотрел (см. ниже), но это основано на продолжительности, а не на указанном количестве вызовов, поэтому все зависит от вашей частоты кадров (к которой я не верю, что вы можете получить доступ). Если вы работаете со скоростью 20 кадров в секунду, вы получите 10 «HELLO AGAIN!», если со скоростью 60 кадров в секунду, вы получите 30.
SKAction *helloAction = [SKAction customActionWithDuration:0.5 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"HELLO AGAIN!");
}];
[self runAction:helloAction];
РЕДАКТИРОВАТЬ:
Казалось бы, что я был на правильном пути с SKAction repeatAction:count:
, где я ошибся, так как NSLog(@"HELLO!");
(или любое вычисление, которое вы могли бы сделать в блоке) является мгновенным действием. В этом случае Sprite Kit повторяет действие только для текущего кадра. Ответ заключается в том, чтобы сделать SKAction
не мгновенным, добавив небольшую задержку через последовательность, теперь Sprite Kit выполняет блок один раз для каждого из следующих 10 кадров.
- (void)testMethod {
SKAction *myAction = [SKAction runBlock:^{
NSLog(@"BLOCK ...");
}];
SKAction *smallDelay = [SKAction waitForDuration:0.001];
SKAction *sequence = [SKAction sequence:@[myAction, smallDelay]];
SKAction *repeatSequence = [SKAction repeatAction:sequence count:10];
[self runAction:repeatSequence];
}
ВЫВОД:
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
[399:60b] BLOCK ...
[399:60b] -[MyScene update:]
Update()
в сцене, если это поможет. По-идиотски Apple забыла функцию обновления в спрайтах. - person Fattie   schedule 28.11.2017