2016-02-22 85 views
0

我需要檢查我的自定義類SKSpriteNode繼承對象中的哪一個被觸摸。我在遊戲中的一些元素,如:我該如何檢查一個SKSpriteNode是否已經觸及了一些從SKSpriteNode繼承的其他類型?

@interface Hero : SKSpriteNode 

和非玩個性元素:

@interface StaticLevelElement : SKSpriteNode 

,我需要檢查哪一個被觸摸,並相應地調用合適的方法(無論是方法形成Hero或來自StaticLevelElement類)。

我可以使用哪種方法來區分特定類型的類?

回答

1

你可以做這樣的事情:

if ([node isKindOfClass:[StaticLevelElement class]]){ 
    NSLog(@"Touched node is StaticLevelElement"); 

}else if([node isKindOfClass:[Hero class]]){ 
    NSLog(@"Touched node is Hero"); 
} 

從文檔約isKindOfClass:方法:

返回一個布爾值,指示接收者是否是給定類或的 實例任何繼承自 該類的類的實例。

看這個部分:

...或從該類

你應該小心,因爲如果你繼承StaticLevelElement這樣繼承任何類的一個實例:

@interface SubclassOfStaticLevelElement : StaticLevelElement 

@end 

而裏面的touchesBegin做到這一點:

if ([node isKindOfClass:[StaticLevelElement class]]){ 

    NSLog(@"Touched node is StaticLevelElement"); 
} 

如果同時觸摸StaticLevelElement的實例和SubclassOfStaticLevelElement的實例,該方法將返回true。這是因爲SubclassOfStaticLevelElement繼承自StaticLevelElement

所以我想,這不是你的最佳方法。在SpriteKit中,在您的情況下,人們經常使用下面的方法(通過設置屬性SKNode'sname)。

裏面你Hero's初始化(或者你能說出你的場景裏你在創建節點):

self.name = @"hero"; 

然後在您的touchesBegan

if ([node.name isEqualToString:@"hero"]){ 
    NSLog(@"Touched node is hero"); 
} 
1

你可以只覆蓋內的touchesBegan方法你的SKSpriteNode子類,並相應地執行它們的功能。這爲錯誤留下了最少量的更改,因爲只有當系統確定特定節點已被觸摸時纔會調用此方法。

如果您需要從主場景中調用某種方法,則可以使用NSNotificationCenter向場景發送消息(如果需要與多個不同的對象進行通信,這也可以使用),您可以調用通過讓英雄擁有一個存儲場景實例的屬性,或者您可以擁有一個名爲isTouched的屬性,在touchesBegan中設置爲true(是),當您處於touchesEnded時設爲false(否),以及touchesCancelled,以及某種識別屬性,以消除進行大量搜索的需要,並且幾乎可以撥打電話,如

if(node.isTouched && node.identifier == "StaticLevelElement") 
    { 
     //do stuff pertaining to StaticLevelElement 
    } 
相關問題