SKAction repeatActionForever не порождает сущность

По сути, у меня есть функция создания сущности, которая теоретически должна создавать на экране случайный воздушный шар с определенными свойствами. Я разработал метод как таковой:

-(void)spawnBalloon
{
    int a = arc4random_uniform(self.frame.size.width);
    int b = self.frame.size.height - 50;
    CGPoint loc = CGPointMake(a, b);
    [self spawnBalloonAtPoint:loc];
}

И этот метод работает. Когда я вызываю его в функции инициализации, он работает. Когда я вызываю его в функции touchesMoved(), он работает. Однако, когда я пытаюсь вызвать его в методе инициализации с

[self runAction:[SKAction repeatActionForever:[SKAction performSelector:@selector(spawnBalloon) onTarget:self]]];

Это терпит неудачу. Почему это? Должен ли я просто использовать функцию PerformSelector из «я», а затем использовать NSTimer, чтобы она повторялась вечно?

Кроме того, я попытался добавить NSLog в код, чтобы увидеть, выполнялся ли он вообще, когда он был в действии повтора, и это так. Единственная проблема в том, что воздушный шар не добавляется на экран. Мне кажется, что когда я вызываю функцию spawnBalloon через repeatActionForever, self ссылается на другой класс? Извините, если это сбивает с толку, я все еще новичок в Objective C и SpriteKit, и вместо того, чтобы много читать, я погрузился и решил учиться, когда это необходимо (однако у меня есть обширные знания Java/C)

РЕДАКТИРОВАТЬ: я понял, что если у меня нет действия repeatForever, код будет выполняться и работать. Однако, если он есть, он не работает.


person TSwift    schedule 09.06.2015    source источник


Ответы (2)


Попробуй это:

[self runAction:[SKAction repeatActionForever:[SKAction sequence:@[
                                                                   [SKAction waitForDuration:0.1],
                                                                   [SKAction performSelector:@selector(spawnBalloon) onTarget:self]
                                                                   ]]]];
person Darvydas    schedule 09.06.2015
comment
Благодарю за ваш ответ. - person TSwift; 09.06.2015

В качестве дополнения к ответу DFrog, который даст вам желаемые результаты, я думаю, вам будет полезно понять, почему ваш код не работает при использовании repeatActionForever:.

repeatActionForever: для работы метода требуется немгновенное действие. Это из документов:

Повторяемое действие должно иметь немгновенную продолжительность.

Мгновенное действие

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

Немгновенное действие

Немгновенное действие имеет продолжительность, в течение которой оно оживляет свои эффекты. При выполнении действие обрабатывается в каждом кадре анимации, пока действие не завершится.

Как вы уже поняли performSelector:onTarget создает действие, которое вызывает метод для некоторого объекта, но это действие запускается мгновенно. Цитата из документов:

... Когда действие выполняется, вызывается метод целевого объекта. Это действие происходит мгновенно...

и, как я упоминал выше, repeatActionForever: метод требует действия с немгновенной продолжительностью, поэтому он не будет работать так, как вы ожидаете.

person Whirlwind    schedule 09.06.2015
comment
Благодарю за ваш ответ. - person TSwift; 09.06.2015