Действие частиц SKEmitterNode не работает бета-версия iOS9

Я тестирую свое приложение в iOS9 Beta 4 и нахожу много кода, который раньше работал в iOS8, но больше не работает должным образом. Другой пример — свойство «particleAction» SKEmitterNode в SpriteKit. Следующий код работал в iOS8, но не работает в iOS9:

// create the particle movement action
SKAction *move = [SKAction moveByX:100 y:100 duration:5]; // also, I've tested several other SKActions, such as scaleBy, fade, rotate, to no effect here        

// create a target node and add to the SKScene
SKNode *targetNode = [SKNode node];
targetNode.position = origin;
[mySKSceneNode addChild:targetNode];

// add an emitter node that has a target and an SKAction
SKEmitterNode *flameTrail = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle]pathForResource:@"FlameAttack" ofType:@"sks"]];
flameTrail.position = origin;
flameTrail.particleAction = move; // TODO iOS9 compatibility issues!
flameTrail.targetNode = targetNode;
[mySKSceneNode addChild:flameTrail];

В iOS8 приведенный выше код давал бы SKEmitterNode, который выглядел бы как летящие искры. В iOS9 SKEmitterNode полностью невидим (вообще не отображается в SKScene). Если я закомментирую следующую строку:

flameTrail.particleAction = move; // TODO iOS9 compatibility issues!

тогда я увижу в сцене SKEmitterNode, но не увижу никакого движения, связанного с частицами.

Я также проверил это с несколькими другими SKActions и не увидел никаких изменений в результатах. Я отправил сообщение об ошибке в Apple; тем временем кто-нибудь может подтвердить/опровергнуть эту проблему или увидеть проблему в коде?


person user2821647    schedule 30.07.2015    source источник
comment
SKEmitterNode также исчезает в OS X El Capitan (GM), когда установлено свойство particleAction.   -  person Milos    schedule 22.09.2015
comment
На самом деле узел-эмиттер не исчезает, только частицы...   -  person Milos    schedule 22.09.2015
comment
Ошибка остается в публичной версии El Capitan...   -  person Milos    schedule 01.10.2015


Ответы (6)


Проблема со свойством targetNode SKEmitterNode в iOS9.

Когда установлено свойство targetNode, частицы будут испускаться в zPosition 0. Не имеет значения, если вы установили zPosition в любое другое значение, частицы все равно будут отображаться в zPosition 0. Если вы напечатаете значение zPosition в консоли, оно будет сообщите все, что вы установили. Если вы установите targetNode = nil, частицы будут отображаться на правильном слое.

Решение: я переупорядочил все свои фоновые спрайты, чтобы они были ‹= -1.

надеюсь, это поможет, я собираюсь подать отчет об ошибке, также я добавил пример репо на github. https://github.com/fromkey/iOS9_BUG_SKEmitterNode_targetNode/tree/master

person Michael Kennedy    schedule 17.09.2015
comment
Я пробовал менять zPosition и добавлять/удалять targetNode; однако у меня все еще есть проблемы с частицей. Мой SKEmitterNode отлично работает, если свойство частицАктион равно нулю. Добавление любого SKAction к частицеAction приводит к тому, что SKEmitterNode просто исчезает из SKScene... - person user2821647; 18.09.2015
comment
@ user2821647, SKEmitterNode также исчезает в OS X El Capitan (GM), когда установлено свойство particleAction. - person Milos; 22.09.2015
comment
Проблема, которую я обнаружил с этой идеей, помимо того факта, что она работала не очень хорошо, заключалась в том, что если у вас есть сенсорный узел, содержащийся внутри узла с отрицательным значением zPosition, касания не передаются сенсорному узлу. Мой ответ ниже, кажется, работает без этого осложнения. - person PKCLsoft; 10.01.2017

Могу подтвердить это на iOS 9 beta 5. Кажется, .particleAction полностью перестал работать! Надеемся, что Apple исправит проблему в следующей бета-версии/сборке GM.

Одна из моих новых игр опирается на это, так что немного нервничаю в данный момент!

person HarryGThompson    schedule 09.08.2015
comment
Гарри, тебе удалось заставить частицу Action работать? Я еще не пробовал на iOS9 Beta 6. Были ли у вас успехи? - person user2821647; 03.09.2015
comment
iOS 9 Beta 6 еще не было :( - person HarryGThompson; 04.09.2015

У меня была похожая проблема, однако проблема для меня заключалась в том, что мой код устанавливал свойство targetNode следующим образом:

class GameScene : SKScene {
    func addEmitter(fileName: String, position: CGPoint) {
        let particle = SKEmitterNode(fileNamed: fileName)!
        particle.position = position
        //particle.targetNode = self // DOES NOT WORK ON iOS 9 BETA
        self.addChild(particle)
        // Don't forget to remove the emitter node after the explosion
        self.runAction(SKAction.waitForDuration(2), completion: { particle.removeFromParent() })
    }
}

Удаление строки частица.targetNode привело к повторному рендерингу частиц. Протестировано на iOS 9 beta 6.

Обновлено, чтобы показать полное использование в SKScene.

person bizz84    schedule 27.08.2015
comment
Удалось ли вам заставить ParticleAction работать на ios9 beta 6? Можете ли вы опубликовать весь рабочий код, чтобы я мог проверить со своей стороны? Мой целевой узел не является родителем, как в вашем ответе. Но мне бы очень хотелось, чтобы частицаAction работала только для проверки работоспособности! - person user2821647; 27.08.2015
comment
Я вообще не использовал ParticleAction — я обновил пример кода с учетом моего варианта использования — все свойства частиц предустановлены в редакторе частиц. - person bizz84; 27.08.2015
comment
Что произойдет, если вы также удалите строку targetNode? Возможно, ваши частицы появятся, но тогда вам нужно найти другой способ заставить их работать в вашей иерархии. - person bizz84; 27.08.2015
comment
Извините за задержку; Наконец, я провел серьезное тестирование, и я все еще не могу заставить частицу работать на iOS9 Beta 5. Я попытался удалить targetNode и не увидел никаких результатов. Проблема для меня, похоже, связана со свойством частиц. Если я оставлю частицуAction nil, появится узел. Если я назначу какой-либо SKAction для частиц, SKEmitterNode просто исчезнет с экрана... - person user2821647; 03.09.2015

У меня была такая же проблема в iOS 9.

Juet удалите свойство targetNode, и оно снова заработает.

person Tony Peng    schedule 17.09.2015
comment
Удалось ли вам заставить SKEmitterNode следовать за SKAction, используя свойство частицаAction? Какой SKAction вы использовали? - person user2821647; 18.09.2015
comment
Да, я скоро отредактирую свой ответ и поделюсь примером. - person Tony Peng; 21.09.2015
comment
Я пытаюсь показать частицы, и это не помогло мне, равно как и настройка zPosition. - person Chris Paveglio; 08.10.2015

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

for (SKNode *node in containerNode.children) {
    if ([node isKindOfClass:[SKEmitterNode class]]) {
      SKEmitterNode *e = (SKEmitterNode *)node;
      [e removeFromParent];

       SKEmitterNode *new = [e copy];
       [containerNode addChild:new];
    }
 }
person jervine10    schedule 09.10.2015
comment
Спасибо за ответ; Я должен буду попробовать это. Когда вы повторяетесь? Каждое обновление или после представления сцены? - person user2821647; 10.10.2015
comment
Просто впервые представляю ноды в сцене. - person jervine10; 10.10.2015

Если вы не хотите потерять функциональность, которую дает вам targetNode, то то, что я нашел, работает, это присвоить значение zPosition как эмиттеру, так и испускаемым частицам.

Обычно я устанавливаю перечисление, чтобы предоставить мне значение позиции Z для всех узлов, например:

typedef enum {
  kZBG = 0,
  kZSpaceship = 10,
  kZBullets = 15,
  kZSpark = 20,
} NodeZOrder;

Затем я использую это в своем испускаемом с помощью:

NSString *sparkPath = [[NSBundle mainBundle] pathForResource:@"spark" ofType:@"sks"];
self.sparkEmitter = [NSKeyedUnarchiver unarchiveObjectWithFile:sparkPath];
self.sparkEmitter.targetNode = self.background;
self.sparkEmitter.zPosition = kZSpark;
self.sparkEmitter.particleZPosition = kZSpark;

Я обнаружил, что это работает нормально. Мои частицы остаются там, где я хочу, на фоне, и все они видны как в iOS 9, так и в iOS 10.

person PKCLsoft    schedule 10.01.2017