Сделать SKAction с помощью селектора выполнения, НО с параметрами

Я хочу создать стену, которая увеличивает размер. Но когда я увеличиваю размер, физическое тело не следует (оно сохраняет тот же размер). Так что у меня есть идея, что SKAction, который повторяется навсегда, выполняет селектор, который изменяет размеры моего физического тела в зависимости от размера объекта.
Поэтому я хотел сделать код вроде:

-(void) sizeChange:(SKSpriteNode *)sprite{
    sprite.physicsbody = [SKPhysicsBody bodyWithRectangleOfSize: sprite.size];
}

Теперь я хочу запустить SKAction, который выполняет селектор с этим. Итак, я написал это:

SKAction *perform = [SKAction performSelector:@selector(sizeChange:) withObject: sprite onTarget: self];
[self runAction:[SKAction repeatActionForever:perform]];


SKAction не работает с "WithObject". Как добавить параметр в SKAction executeSelector? Спасибо!

РЕДАКТИРОВАТЬ:
По сути, я хочу эквивалентность SKAction:

[self performSelector:@selector(sizeChange:) withObject:sprite];

Или способ повторить код, прежде чем навсегда. Благодарю вас!

2 ответа

Проверять, выписываться customActionWithDuration:actionBlock: метод SKAction это создает действие, которое выполняет блок в течение продолжительности. Вы можете указать свой код в блоке действий.

+ (SKAction *)customActionWithDuration:(NSTimeInterval)seconds 
                           actionBlock:(void (^)(SKNode *node, 
                                          CGFloat elapsedTime))block

Кроме того, вы также можете использовать runBlock: метод.

SKAction* blockAction = [SKAction runBlock:^
{
    // your code here 
}];

[someNode runAction:blockAction];

Это беспокоило меня некоторое время, но для этой проблемы есть простое решение.

Сначала создайте SKAction, чтобы он повторялся вечно, как это (в случае, если вам нужно отложить выполнение метода):

-(void)resizingMySprite
{ 
  //Set duration as long as you want. In my case I needed as low as possible)
  SKAction *wait = [SKAction waitForDuration:0.01];
  SKAction *performSelector = [SKAction performSelector:@selector(resizing)];
  SKAction *sequence = [SKAction sequence:@[performSelector, wait];
  SKAction *repeat = [SKAction repeatActionForever:sequence];

  [self runAction:repeat];
}

Затем создайте метод resizing и в нем вы запустите ваш метод с аргументами:

-(void)resizing
{
  //Let's say you wish to run your method on sprite called mySprite
 [self sizeChange:mySprite];
}
Другие вопросы по тегам