2015-07-30 12 views
5

Sto testando la mia app in iOS9 Beta 4 e trovando molto codice che funzionava in iOS8 che non funziona più come previsto. Un altro esempio è la proprietà "particleAction" di SpriteKit's SKEmitterNode. Il seguente codice ha lavorato in iOS 8, ma non funziona su iOS9:SKEmitterNode particleAzione non funzionante iOS9 Beta

// 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]; 

Su iOS 8 del codice di cui sopra produrrebbe uno SKEmitterNode che sembrava scintille. Su iOS9 SKEmitterNode è totalmente invisibile (non appare affatto in SKScene). Se commento la riga seguente:

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

poi vedrà la SKEmitterNode nella scena ma non vedrà alcun movimento associato con le particelle.

Ho anche provato questo con molte altre SKActions e non ho visto alcun cambiamento nei risultati. Ho inviato un bug ad Apple; nel frattempo qualcuno può confermare/negare questo problema o vedere un problema nel codice?

+1

'SKEmitterNode' scompare anche su OS X El Capitan (GM) quando viene impostata la proprietà' particleAction'. – milos

+1

Infatti, il nodo dell'emettitore non sta scomparendo, "solo" le particelle ... – milos

+1

Il bug rimane nella versione pubblica di El Capitan ... – milos

risposta

1

Può confermare questo su iOS 9 beta 5. .particleAction sembra aver smesso di funzionare completamente! Sperando che Apple risolva la prossima versione beta/GM.

Uno dei miei nuovi giochi si basa su questo in modo un po 'nervoso al momento!

+0

Harry, sei riuscito a far funzionare particleAction? Non ho ancora provato su iOS9 Beta 6. Hai avuto qualche successo? – user2821647

+0

Non c'è stato un iOS 9 Beta 6 :( – HarryGT

0

Ho avuto un problema simile me stesso, ma il problema per me era che il mio codice è stato l'impostazione della proprietà TARGETNODE in questo modo:

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() }) 
    } 
} 

Rimozione della linea di particle.targetNode ha provocato le particelle di essere resi di nuovo. Testato su iOS 9 beta 6.

Aggiornamento per mostrare l'utilizzo completo all'interno di SKScene.

+0

Sei riuscito a far funzionare particleAction su ios9 beta 6? Puoi pubblicare l'intero codice funzionante in modo da poter testare sul mio terminale? Il mio nodo di destinazione non è il genitore nella tua risposta, ma mi piacerebbe davvero vedere la funzione particleAction che funziona solo per un controllo di integrità! – user2821647

+0

Non stavo affatto utilizzando particleAction, ho aggiornato il codice di esempio con il mio caso d'uso: tutte le proprietà delle particelle sono preimpostate nell'editor delle particelle – bizz84

+0

succede se si rimuove anche la linea targetNode? Potrebbe essere che le particelle appariranno ma poi è necessario trovare un altro modo per farlo funzionare nella tua gerarchia. – bizz84

2

iOS9 SKEmitterNode problema di proprietà targetNode.

Quando la proprietà targetNode è impostata, le particelle emetteranno su zPosition 0. Non importa se si imposta zPosition su qualsiasi altra cosa, le particelle continueranno a essere visualizzate su zPosition 0. Se si stampa il valore di zPosition su la console riporterà qualunque cosa tu abbia impostato. Se imposti targetNode = nil, le particelle verranno renderizzate sul livello corretto.

Soluzione: ho riordinate tutti i miei sprite di fondo di essere < = -1

speranza che questo aiuta, ho intenzione di presentare un bug report, anche ho aggiunto un esempio di pronti contro termine su github. https://github.com/fromkey/iOS9_BUG_SKEmitterNode_targetNode/tree/master

+1

Ho provato a variare zPosition e ad aggiungere/rimuovere il targetNode; tuttavia sto ancora avendo problemi con particleAction. Il mio SKEmitterNode funziona bene se la proprietà particleAction è nulla. L'aggiunta di qualsiasi SKAction a particleAction fa sì che SKEmitterNode scompaia semplicemente da SKScene ... – user2821647

+0

@ user2821647, 'SKEmitterNode' scompare anche su OS X El Capitan (GM) quando viene impostata la proprietà' particleAction'. – milos

+0

Il problema che ho riscontrato con questa idea, a parte il fatto che non ha funzionato molto bene, è che se si dispone di un nodo sensibile al tocco contenuto in un nodo con una posizione z negativa, i tocchi non vengono passati al nodo sensibile al tocco. La mia risposta qui sotto sembra funzionare senza questa complicazione. – PKCLsoft

0

ho avuto un stesso problema in iOS 9.

Juet rimuovere la proprietà targetNode, e funzionerà di nuovo.

+0

Sei riuscito a ottenere un SKEmitterNode per seguire una SKAction usando la proprietà particleAction? Che SKAction stavi usando? – user2821647

+0

Sì, modificherò la mia risposta e condividerò presto un esempio. –

+0

Sto cercando di far visualizzare le particelle e questo non ha risolto il problema per me, né ha modificato la zPosition. –

0

Avevo lo stesso problema durante la creazione di un SKEmitterNode che è nidificato in un file di scena. Ho finito per iterare tutti i nodi, trovare gli emettitori e farne delle copie. Quindi ha iniziato a funzionare di nuovo.

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

     SKEmitterNode *new = [e copy]; 
     [containerNode addChild:new]; 
    } 
} 
+0

Grazie per la risposta; Dovrò provarlo. Quando esegui l'iterazione? Ogni aggiornamento o dopo la scena è presentato? – user2821647

+0

Solo la prima volta che presento i nodi nella scena. – jervine10

0

Se non si vuole perdere la funzionalità che TARGETNODE ti dà, allora che cosa ho trovato le opere, è quello di assegnare un valore zPosition sia per l'emettitore, e le particelle emesse.

Io di solito istituito un enum di fornire me con valore di posizione Z per tutti i nodi come:

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

allora io uso questo nel mio emessa con:

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; 

ho scoperto che questo funziona bene. Le mie particelle rimangono dove le voglio sullo sfondo e sono visibili su iOS 9 e iOS 10.

Problemi correlati