ios7 - Cómo desactivar la interacción del usuario del nodo secundario cuando el nodo padre tiene habilitado en SpriteKit
sprite-kit skemitternode (2)
Tengo un SKNode que tiene habilitada la interacción del usuario y estoy agregando un SKEmitterNode a eso y quiero que la interacción del usuario esté deshabilitada solo para el niño. Este código no funciona.
SKNode* parentNode = [[SKNode alloc] init];
parentNode.userInteractionEnabled = YES;
NSString* path = [[NSBundle mainBundle] pathForResource:@"ABCDEFG" ofType:@"xyz"];
SKEmitterNode* childNode = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
childNode.userInteractionEnabled = NO;
[parentNode addChild:childNode];
También intenté configurar la interacción del usuario a NO después de agregar al padre. ¿Es esto posible o necesito agregar el emisor al padre del padre de alguna manera?
Estoy seguro de que hay una mejor manera (¡y espero que exista!), Pero es un comienzo.
Tal vez así es como debería hacerse. El problema es si tienes un emisor sobre un sprite, el toque no pasa (no lo hice en mis pruebas).
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *touch in touches) {
UITouch *touch = [touches anyObject];
CGPoint positionInScene = [touch locationInNode:self];
SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:positionInScene];
if (touchedNode.userInteractionEnabled) {
NSLog(@"Name of node touched %@", touchedNode.name);
}
else {
NSLog(@"Can''t touch this! %@", touchedNode.name);
}
}
}
Logré esto enviando una notificación del padre, a su padre con la ubicación del grifo. La función en el padre-padre genera el emisor con la interacción del usuario desactivada y el objetivo de las emisiones establecidas en el padre. Quizás algún código esté en orden.
En el padre:
UITouch *touch = [touches anyObject];
// to get the location in the scene
CGPoint location = [touch locationInNode:[self parent]];
NSDictionary* locationDic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: [NSNumber numberWithFloat:location.x],
[NSNumber numberWithFloat:location.y],
nil]
forKeys:[NSArray arrayWithObjects:@"loc_x", @"loc_y", nil]];
[[NSNotificationCenter defaultCenter] postNotificationName:@"Ntf_SpawnParticles"
object:nil
userInfo:locationDic];
En el padre del padre (la escena), regístrese para el evento:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(spawnParticles:)
name:@"Ntf_SpawnParticles"
object:nil];
Aún en el padre del padre (la escena), implementa "spawnParticles":
- (void)spawnRockDebris:(NSNotification *)ntf
{
float x = [[[ntf userInfo] valueForKey:@"loc_x"] floatValue];
float y = [[[ntf userInfo] valueForKey:@"loc_y"] floatValue];
CGPoint location = CGPointMake(x, y);
NSString* particlePath = [[NSBundle mainBundle] pathForResource:@"CoolParticles" ofType:@"sks"];
SKEmitterNode* particleEmitterNode = [NSKeyedUnarchiver unarchiveObjectWithFile:particlePath];
// set up other particle properties here
particleEmitterNode.position = location;
particleEmitterNode.userInteractionEnabled = NO;
particleEmitterNode.targetNode = [self childNodeWithName:@"particleTargetNode"];
[self addChild:particleEmitterNode];
}