Подтвердить что ты не робот

Дублирование эффекта излучателя частиц в наборе 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 будут смотреть на разные узлы-эмиттеры, мы просто приложим излучатели к каждой игровой камере, когда это необходимо.

4b9b3361

Ответ 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];
}

Я знаю, что вам не нужен весь этот код, но если это то, что вы хотите каким-то образом, я опубликую его для полноты. И вот результат: введите описание изображения здесь