Дублирование эффекта излучателя частиц в наборе Sprite
Мне нужно, чтобы эффекты частиц-эмиттеров отображались в двух точках (для целей разделения экрана), мне интересно, сумел ли кто-нибудь найти способ сделать это. Моя цель - запустить это на iOS 10. Вот что я пробовал до сих пор.
- Назначение
targetNode
для SKNode
, а затем копирование SKNode
каждого кадра: targetNode
для меня не работает в iOS 10.
- Назначение эмиттера частиц
SKNode
и использование view.textureFromNode
для создания текстуры для копирования каждого кадра: занимает 1/120-е кадров, что слишком медленно для меня.
- Назначение пользовательского действия для частицы node, которая дублирует node в другой
SKNode
: действия не будут выполняться на iOS 10
- Копирование существующей частицы node в надежде, что семя не является случайным: семя случайное
- Пробное копирование эмиттера частиц при обновлении: Particle только порождает в начале
- Tried SKReferenceNode: только копия эмиттера, запускается самостоятельно
Единственный вариант, который я оставил для истинного испускания, - это написать собственный излучатель частиц, который я стараюсь избегать, поэтому мне интересно, есть ли у кого-нибудь еще эта проблема и знали о решении для достижения желаемого эффекта.
Другая вещь, которую я мог бы сделать, - предварительное излучение излучателей, но это займет много текстурной памяти, если я пойду по этому маршруту.
Изменить: Чтобы визуализировать изображение, я нарисовал изображение. Белая рамка показывает, где происходит сплит-экран. Черная рамка показывает, где происходит смена сцены.
![введите описание изображения здесь]()
Как сейчас, оба игрока 1 и игрок 2 находятся на исходной сцене.
Игрок 2 идет направо и собирается поразить мировой оберткой, чтобы переместить его в левую сторону мира, но он еще не ударил его. Поэтому мне нужно иметь копию сцены, чтобы она визуально выглядела как одна сцена. Поскольку игрок 1 все еще находится на исходной сцене, оригинальному эмиттеру нужно оставаться на месте. Игроку 2 нужно будет увидеть одно и то же изображение, происходящее в копии, иначе, как только он пройдет эту границу, произойдет "глючный" эффект, и иллюзия обертывания теперь исчезнет.
Итоговый результат:
Мы только что сказали, что F %%% it, Player 1 и Player 2 будут смотреть на разные узлы-эмиттеры, мы просто приложим излучатели к каждой игровой камере, когда это необходимо.
Ответы
Ответ 1
Это просто работает (я предполагаю, что и предполагалось), но я не знаю, насколько это исполнено или как оно соответствует вашим потребностям и вашей текущей игре. В любом случае, может быть, это может помочь вам каким-то образом. Во-первых, в вашем GameViewController... Split screen:)
#import "GameViewController.h"
#import "GameScene.h"
@implementation GameViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Configure the view.
SKView * leftSKView = (SKView *)self.leftScene;
leftSKView.ignoresSiblingOrder = YES;
leftSKView.showsFPS = YES;
leftSKView.showsNodeCount = YES;
SKView * rightSKView = (SKView *)self.rightScene;
rightSKView.ignoresSiblingOrder = YES;
rightSKView.showsFPS = YES;
rightSKView.showsNodeCount = YES;
// Create and configure the scene.
GameScene *scene = [GameScene nodeWithFileNamed:@"GameScene"];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[leftSKView presentScene:scene];
[rightSKView presentScene:scene];
}
leftScene
и rightScene
- это UIViews, определенные в раскадровке, используя автозапуск, чтобы принимать по меньшей мере половину экрана. Также класс переключается на SKView (это был UIView). Довольно тривиальный...
Затем в вашей игровой сцене просто добавьте излучателя, который будет разделяться между этими двумя видами. Поскольку используется только один эмиттер, частицы, излучающие (как они перемещаются), будут зеркально отражены. Итак, в игровой сцене просто добавьте частицу:
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
SKEmitterNode *emitter = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"]];
emitter.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidX(self.frame));
emitter.name = @"explosion";
emitter.targetNode = self;
[self addChild:emitter];
}
Я знаю, что вам не нужен весь этот код, но если это то, что вы хотите каким-то образом, я опубликую его для полноты. И вот результат:
![введите описание изображения здесь]()