Как использовать SKEmitterNode в наборе спрайтов для достижения эффекта тумана войны?

Я пытаюсь использовать SKEmitterNode для создания шейдера, вроде как в Pokemon, когда вы находитесь в пещере: http://www.serebii.net/pokearth/maps/johto-hgss/38-route31.png

Вот код, который у меня есть до сих пор:

NSString *burstPath =
  [[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"];

  SKNode *area = [[SKNode alloc] init];

  SKSpriteNode *background = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(self.frame.size.width, self.frame.size.width)];
  background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

  SKEmitterNode *burstNode =
  [NSKeyedUnarchiver unarchiveObjectWithFile:burstPath];
  burstNode.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));

  burstNode.particleBlendMode = SKBlendModeSubtract;
  [area addChild:background];
  [area addChild:burstNode];
  [self addChild:area];

Вот SKEmitterNode: http://postimg.org/image/60zflqjzt/

У меня было две идеи. Первый заключался в создании прямоугольного узла SKSpriteNode и удалении узла SKEmitterNode из прямоугольного узла SKSpriteNode. Таким образом, у нас есть черный прямоугольник с «дырой» в центре, сквозь которую мы можем видеть.

Второй заключался в том, чтобы добавить прямоугольный узел SKSpriteNode и узел SKEmitter к другому узлу SKNode (области), затем установить режим частицBlendMode узла SKEmitterNode и, наконец, установить альфа-канал узла SKNode (область) в зависимости от цвета. Например, если цвет пикселя черный, альфа-значение этого пикселя будет равно 1,0, а другой пиксель белый, альфа-значение этого другого пикселя будет равно 0,0.

Этот вопрос является возможным дубликатом Как создать альфа-маска в iOS с использованием набора спрайтов в некотором роде, но, поскольку хорошего ответа не было дано, я предполагаю, что это не проблема.

Спасибо большое.


person Maxime Delisle    schedule 21.06.2014    source источник


Ответы (2)


Это не те узлы, которые вы ищете! ;)

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

Основываясь на связанном снимке экрана, вам действительно нужно только изображение с «дырой» в нем, прозрачной областью. Изображение должно быть размером с экран и просто закрывать границы в той степени, в которой вам это нужно. Это будет нераскрывающийся туман войны, а точнее просто эффект тьмы, окружающей игрока.

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

person LearnCocos2D    schedule 21.06.2014
comment
У вас есть идеи, как я могу добавить к изображению эффект мерцания пламени? И недостатком вашего ответа является то, что мне приходится создавать дополнительное изображение каждый раз, когда мне нужен другой радиус:/в противном случае это хорошая идея :) - person Maxime Delisle; 21.06.2014
comment
Другой радиус достигается масштабированием спрайта тумана войны. - person LearnCocos2D; 21.06.2014
comment
Любая идея для мерцания факела/пламени? - person Maxime Delisle; 22.06.2014
comment
не совсем, может другое прозрачное изображение с непрерывным изменением непрозрачности - person LearnCocos2D; 22.06.2014

Теперь, с мощными устройствами этой эпохи (iPhone 12), можно ли использовать «SKEmitterNode» без потери слишком большого количества кадров в секунду. Вы должны создать SKS (файл частиц SpriteKit) с этим изображением: < img src="https://i.stack.imgur.com/5w6QH.png" alt="введите здесь описание изображения" />

Затем установите свои вары, как на этой картинке:

введите здесь описание изображения

Итак, перейдите к своему коду и добавьте к своей частице что-то вроде этого примера:

let fog = SKEmitterNode(fileNamed: "fog")
fog.zPosition = 6
self.addChild(fog)
fog.position.y = self.frame.midY
fog.particlePositionRange.dx = self.size.width * 2.5
person Alessandro Ornano    schedule 01.12.2020