2013-11-25 63 views
4

大家好我是新來的spriteKit和objective-c,我想在一個方法中創建一個spriteNode,並在另一個方法中刪除它(同樣的.m文件) 在這種方法中,我創建精靈:在spritekit中訪問子節點

(void)createSceneContents{ /*in this method i create and add the spaceship spriteNode 
     SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 

     //code... 

     //Add Node 
     [self addChild:spaceship]; 
    } 

,現在我想刪除的節點觸碰它,但我只知道處理觸摸事件的方法是:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

我想從我的訪問節點飛船我不能。我試過一切都沒有成功。有沒有辦法將一個節點從一個方法發送到另一個?或者沒有發送它, 是否可以從未聲明的方法訪問子節點?

回答

8

試試這個:您的節點的

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 
    SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:positionInScene]; 
} 

您還可以設置名稱:

[sprite setName:@"NodeName"]; 

,您可以通過名稱來訪問它:

[self childNodeWithName:@"NodeName"]; 
+0

是'<'的'<@ 「節點名」'一個錯字或句法我不熟悉? –

+0

@MartinThompson我編輯它,它是錯字,感謝指出它。 – Greg

2

是的,有一種方法。

每個SKNode對象都有一個名爲「name」的屬性(屬於NSString類)。您可以使用此名稱來枚舉節點的子節點。

試試這個:

spaceship.name = @"spaceship"; 

touchesBegan

[self enumerateChildNodesWithName:@"spaceship" usingBlock:^(SKNode *node, BOOL *stop) { 
    [node removeFromParent]; 
}]; 

不過要小心,這將刪除每個節點的名稱爲 「宇宙飛船」 從它的父。如果你想對刪除過程更有選擇性,你可以繼承SKSpriteNode來保存一些值,你可以用它來判斷它是否應該被刪除,或者你可以根據某些邏輯將你的sprites添加到數組中,然後使用數組刪除。

祝你好運!

0

使用 「名」屬性起作用,但如果您認爲只有該節點的一個實例,則應該創建一個屬性。

@property (strong, nonatomic) SKSpriteNode *spaceship; 

然後,當你想添加:

self.spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 

[self addChild:self.spaceship]; 

然後在的touchesBegan:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = touches.anyObject; 
    SKSpriteNode *node = [self nodeAtPoint:[touch locationInNode:self]]; 
    if (node == self.spaceship) { 
     [self.spaceship removeFromParent]; 
    } 
}