Невозможно приостановить SKEmitterNode в iOS9

Я пробовал несколько обходных путей, но все равно не могу приостановить существующие частицы на iOS9. Я использую следующую технику, чтобы приостановить сцену:

  • приостановить сцену с self.paused = YES;
  • установите пользовательскую переменную globalPause = YES; для управления выполнением метода update: (поскольку update: все еще работает, пока сцена приостановлена).

Дело в том, что я останавливаю не вид, а сцену. Я не приостанавливаю просмотр из-за этого.

Вот код, который может воспроизвести эту проблему на iOS9:

#import "GameScene.h"

@interface GameScene ()

@property (nonatomic, strong)SKEmitterNode *emitter;

@end

@implementation GameScene


-(void)didMoveToView:(SKView *)view {


    [self addChild:[self getSpaceDustEmitter]];

}

//No need for this method though :)

-(SKEmitterNode*)getSpaceDustEmitter{

    self.emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"spacedust" ofType:@"sks"]];
     self.emitter .name = @"emitter_spacedust";
    self.emitter .position = CGPointMake(CGRectGetMidX(self.frame),self.frame.size.height);



    return  self.emitter ;
}


@end

Итак, очень простой пример, который работает на iOS8 и не работает должным образом на iOS9. Что происходит, так это то, что даже если все выглядит приостановленным, это не так. Существующие частицы после снятия паузы перемещаются в точку, где они должны быть, если бы сцена не была поставлена ​​на паузу. Кроме того, похоже, что частицы тоже продолжают появляться, что может вызвать заметное отставание при снятии паузы, если пауза была длинной...

Вот скриншот из редактора частиц:

редактор частиц

У кого-нибудь есть разумное объяснение? До сих пор я пытался явно приостановить эмиттер:

emitterNode.paused = YES;

Это не сработало, и на самом деле это должно делаться автоматически, когда сцена поставлена ​​на паузу (в сцену добавлен эмиттер). Другая вещь, которую пытаются установить, это установить emitter.particleSpeed = 0;, а также emitter.particleSpeedRange = 0; и emitter.particleBirthRate = 0;, но это не влияет на уже существующие частицы (что имеет смысл).

Вот и все. Не уверен, что это ошибка, но у меня закончились идеи...


person Whirlwind    schedule 23.09.2015    source источник
comment
Вы нашли обходной путь для приостановки SKEmitterNode?   -  person WangYudong    schedule 01.10.2015
comment
@WangYudong Не совсем ... У вас такая же проблема?   -  person Whirlwind    schedule 01.10.2015
comment
да. В iOS 8 все было ок. И я попробовал то, что вы сказали в своем посте, и получил те же результаты.   -  person WangYudong    schedule 02.10.2015
comment
Попробуйте временно удалить его со сцены.   -  person Micrified    schedule 07.02.2016
comment
@Owatch Если вы удалите эмиттер из его родителя, существующие частицы также будут удалены, а это не то, чего я хочу. Я пытаюсь прекратить излучение, пока приложение находится в фоновом режиме, и продолжить излучение, когда приложение вернется на передний план. Кроме того, я пытаюсь приостановить существующие частицы и заставить их продолжать свое движение с той точки, из которой они ушли, при возвращении приложения из фона.   -  person Whirlwind    schedule 11.02.2016
comment
Хорошо, теперь я понимаю. Спасибо!   -  person Micrified    schedule 11.02.2016
comment
Добавил ответ, но это может быть просто потому, что мы сейчас в iOS9.3, это все еще проблема для вас, потому что с 9.3. пауза работает   -  person Knight0fDragon    schedule 12.04.2016
comment
@Knight0fDragon Я не вижу твоего ответа .. Ты его удалил?   -  person Whirlwind    schedule 12.04.2016
comment
Да, я удалил его, потому что тестировал на 9.3, понял, что это старо   -  person Knight0fDragon    schedule 13.04.2016
comment
@Knight0fDragon Ну, вы можете опубликовать это, если уверены, что это работает. Я приму это. Это может быть полезно для читателей ... Я все еще на 9.1, и это не работает для меня ... Так что, если вы считаете, что это исправлено, не стесняйтесь публиковать свой ответ.   -  person Whirlwind    schedule 13.04.2016
comment
Что ж, исправление уже есть в вашем вопросе, чтобы приостановить и узел, и сцену, но, как я уже сказал. Это на 9.3, я получу симулятор 9.1 и посмотрю, не останавливаются ли мои частицы   -  person Knight0fDragon    schedule 13.04.2016
comment
Он делает паузу для вас на симуляторе? он делает паузу для меня на симуляторе iOS 9.1 iPhone 4s   -  person Knight0fDragon    schedule 13.04.2016
comment
@Knight0fDragon Он приостанавливается, но проблема в том, что он не приостанавливается ... Частицы должны продолжаться с того места, где они остались, но этого не происходит ...   -  person Whirlwind    schedule 13.04.2016
comment
хорошо, я попробую, подожди   -  person Knight0fDragon    schedule 13.04.2016
comment
Похоже, время симуляции для частиц не приостанавливается в 9.1, но пауза исправлена ​​​​в 9.3, интересно, есть ли уведомление, вызываемое для приостановки частиц.   -  person Knight0fDragon    schedule 13.04.2016
comment
@Knight0fDragon Так что это явно исправлено в 9.3. Это хорошая новость...   -  person Whirlwind    schedule 13.04.2016
comment
да, 9.3 работает нормально, отстой, что такие вещи не исправляются до следующей итерации iOS, я пытался увеличить время симуляции на отрицательное число, это не работает   -  person Knight0fDragon    schedule 13.04.2016
comment
@Knight0fDragon Да... По крайней мере, это работает на iOS9.3... Я пробовал много разных способов заставить это работать на iOS9.1 (приостановка узла эмиттера, изменение его скорости, игра с частотой рождения частиц и т. д. и т. д.) и ничего особенного работал.   -  person Whirlwind    schedule 13.04.2016
comment
хорошо, я знаю, что мы можем сделать, получить время, в течение которого излучатель играл до кнопки паузы, затем перезагрузить симулятор и использовать advanceSimulationTime, чтобы сбросить его при снятии с паузы.   -  person Knight0fDragon    schedule 13.04.2016
comment
Теоретически это может сработать... Попробую просто ради интереса, как только найду время. Лично я не сторонник этих обходных путей. Если что-то не получается, пропускаю. Я использую что-то другое. Тем не менее, то, что вы говорите, имеет смысл, и, надеюсь, это может быть хорошим обходным путем.   -  person Whirlwind    schedule 13.04.2016
comment
Да, я их тоже не люблю, но Apple действительно не дает выбора, и я не сторонник заставлять людей обновлять свои телефоны или не использовать мое приложение (у меня 6+ все еще на iOS 8)   -  person Knight0fDragon    schedule 13.04.2016


Ответы (1)


Чтобы приостановить сцену:

currentScene.speed = 0
currentScene.paused = true

Чтобы возобновить сцену

currentScene.speed = Variables.gameSpeed
currentScene.paused = false

Это работает для вас?

PS: Над какой версией iOS вы работаете? Читал про проблемы с iOS9.1, которые вроде исправили в 9.3, про те эмиттеры.

person David Gourde    schedule 24.06.2016