2013-10-08 29 views
2

我有一個啓用了用戶交互的SKNode,並且我正在爲該節點添加一個SKEmitterNode,並且我希望僅爲孩子禁用用戶交互。此代碼不起作用。如何在父節點在SpriteKit中啓用子節點時關閉用戶交互

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

我也嘗試在添加到父級後將用戶交互設置爲NO。這是可能的還是我需要添加發射器父母的父母不知何故?

+0

你是如何檢查觸摸/用戶交互。 – DogCoffee

+0

touchesBegan父母。如果你點擊父母,它就會像按動按鈕一樣產生動畫,併產生一些粒子。 – miek

+0

今天發現了這一點,在節點上設置userInteractionEnabled允許節點本身接收事件。這意味着你會實現touchesBegan:withEvent:在那個實際的對象 – DogCoffee

回答

0

我通過發送來自父母的通知,以父母的位置與水龍頭的位置來實現此目的。父 - 母函數產生禁用用戶交互的發射器,並將排放目標設置爲父項。也許一些代碼是有序的。

在父:

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

在父親的父親(的場景),註冊事件:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(spawnParticles:) 
              name:@"Ntf_SpawnParticles" 
              object:nil]; 
在父親的父親

儘管如此(現場),實行 「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]; 
} 
1

我確定有更好的方法(並希望有!!),但它是一個開始。

也許這是應該如何做。問題是如果你有一個發射器超過精靈,觸摸不通過(很好沒有在我的測試中)。

-(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); 
     } 
    } 
} 
+0

這是造成一些怪異。它會隨機讓我點擊不是父母的地方(可能是因爲之前的發射器仍然有效)。有時它不會讓我點擊父母,因爲正在發射粒子。我希望發射的粒子是空靈的。 – miek

+0

@miek我同意,必須有更好的方法。我無法使發射的粒子變得空靈 – DogCoffee

相關問題