swift sprite-kit skemitternode

swift - Duplicar un efecto de emisor de partículas en el kit de Sprite



sprite-kit skemitternode (1)

Necesito que los efectos de los emisores de partículas aparezcan duplicados en 2 puntos (para propósitos de pantalla dividida), me pregunto si alguien ha encontrado una forma de hacerlo. Mi objetivo es tener esto funcionando en iOS 10. Esto es lo que he intentado hasta ahora.

  1. Asignar targetNode a un SKNode y luego copiar SKNode cada frame: targetNode no funciona en iOS 10 para mí.
  2. Asignar el emisor de partículas a un SKNode , y usar view.textureFromNode para hacer una textura para copiar cada fotograma: toma 1 / 120o de un fotograma, demasiado lento para mí.
  3. Asignación de una acción personalizada a un nodo de partículas que duplica el nodo en otro SKNode : las acciones no se ejecutarán en iOS 10
  4. Copiando el nodo de partícula existente con la esperanza de que la semilla no sea aleatoria: La semilla es aleatoria
  5. Se intentó copiar el emisor de partículas en la actualización: la partícula solo se genera en el origen
  6. Probar SKReferenceNode: solo una copia del emisor, se ejecuta por sí solo

La única opción que me queda para emitir de verdad es escribir mi propio emisor de partículas, lo cual trato de evitar, así que me pregunto si alguien más tuvo este problema y conoció una solución para lograr el efecto deseado.

La otra cosa que podría hacer es presentar previamente los emisores, pero esto tomará una gran cantidad de memoria de textura si sigo esta ruta.

Edición: para ayudar a visualizar, dibujé una imagen, el borde blanco muestra dónde ocurre la pantalla dividida. El borde negro muestra donde ocurre la envoltura de la escena.

A partir de ahora, tanto el Jugador 1 como el Jugador 2 están en la escena original.

El Jugador 2 está caminando a la derecha y está a punto de golpear una envoltura del mundo para moverlo al lado izquierdo del mundo, pero todavía no lo ha golpeado. Así que necesito tener una copia de la escena para que se vea como una escena. Como el jugador 1 aún está en la escena original, el emisor original debe permanecer en su lugar. El jugador 2 tendrá que ver la misma imagen sucediendo en la copia, de lo contrario, una vez que pase ese borde, se producirá un efecto "glitchy", y la ilusión de envolver se habrá ido.

Resultado final:

Acabamos de decir F %%% it, Player 1 y Player 2 verán diferentes nodos emisores, solo adjuntaremos los emisores a la cámara de cada jugador cuando sea necesario.


Esto simplemente funciona (supongo que fue mi intención), pero no tengo idea de cuánto es el rendimiento o cómo se ajusta a sus necesidades y su juego actual. De todos modos, tal vez pueda ayudarte de alguna manera. Primero, en tu GameViewController ... Pantalla dividida :)

#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 y rightScene son vistas UIV definidas en un guión gráfico que usan autolayout para tomar la mitad de una pantalla cada una. También se cambia una clase a SKView (era UIView). Bastante trivial ...

Luego, en la escena del juego, solo agrega un emisor que se compartirá entre estas dos vistas. Debido a que solo se usa un emisor, las partículas que emiten (cómo se mueven) se reflejarán. Así que en la escena del juego, solo agrega una partícula

-(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]; }

Sé que no necesita todo este código, pero si esto es lo que quiere de alguna manera, lo publicaré para que esté completo. Y aqui esta el resultado: