2014-07-09 49 views
0

我是Objective-C的新手,我對它的語義有着苛刻的時間。讓說我有存儲在一個的NSMutableDictionary一堆SKSpriteNode的指向爲每個精靈代碼中的枚舉狀態:SKSpriteNode的NSMutableDictionary

typedef enum PAWN_STATUS { OUT=0, MOVING, LANDED, IDLE } PAWN_STATUS; 

然後

NSMutableDictionary* pawns = [[NSMutableDictionary alloc] init]; 

for(int i=0; i<10; ++i) { 
    SKSpriteNode *whiteButton = [SKSpriteNode spriteNodeWithImageNamed:@"white"]; 
    [pawns setObject:[NSNumber numberWithInt:OUT] forKey:whiteButton]; 
} 

然後我改變了某些精靈的狀態,說

SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:location]; 
[pawns setObject:[NSNumber numberWithInt:LANDED] forKey:touchedNode]; 

但不改變現有SKSpriteNode的狀態,最後一行是添加一個新的SKSpriteNode。所以我的問題是爲什麼這樣?哈希沒有爲節點定義?

+0

難道你有你的key/value對象將它們添加到字典中時將它們置於前面? – trojanfoe

+0

對不起trojanfoe,但你是什麼意思,由前到後? –

+0

'floatingPawnButton'從哪裏來?它不應該被'touchedNode'? – sergio

回答

2

我會建議一個完全不同的方法來試圖完成。

確實是可以關聯用戶數據的節點通過以下SKNode屬性:

@property(retain, nonatomic) NSMutableDictionary *userData 

所以,你不需要處理自己的字典相關聯,其狀態的節點。你可以這樣做:

touchedNode.userData = @{@"myNodeState":@LANDED}; 

後來,你會怎麼做:

if ([touchedNode.userData[@"myNodeState"] intValue] == LANDED) 
    ... 

我們還使用 「現代」 的Objective-C語法使其更容易。

另一個無關的改進可讀性將來自使用static const * NSString的枚舉,而不是你的狀態:

在.h文件中:

typedef NSString* MyStateEnums; 
const MyStateEnums MyStateEnumLanded; 

在.m文件:

const MyStateEnums kMyStateEnumLanded = @"landedNodeState"; 

所以你可以這樣做:

 touchedNode.userData = @{@"myNodeState": kMyStateEnumLanded}; 

,更重要的是:

if (touchedNode.userData[@"myNodeState"] == kMyStateEnumLanded) 

編輯:

,以檢查是否NSDictionary中可與SKNodeSprite,做這個簡單的測試:

//-- your code: 
NSMutableDictionary* pawns = [[NSMutableDictionary alloc] init]; 
for(int i=0; i<10; ++i) { 
    SKSpriteNode *whiteButton = [SKSpriteNode spriteNodeWithImageNamed:@"white"]; 
    [pawns setObject:[NSNumber numberWithInt:OUT] forKey:whiteButton]; 
} 
//-- testing: 
for (SKSpriteNode* node in [pawns allKeys]) { 
    [pawns setObject:[NSNumber numberWithInt:LANDED] forKey:node]; 
} 
for (SKSpriteNode* node in [pawns allKeys]) { 
    NSLog(@"Node %x state: %d", (int)node, [[pawns objectForKey:node] intValue]); 
} 
+0

當然sergio我知道我可以那樣做,謝謝。但是這並不能解決爲什麼NSMutableDictionary添加新對象而不是修改現有對象的問題?是否因爲SKSpriteNode沒有定義哈希值? –

+0

我認爲問題在於OPs代碼中缺少MVC模式(在這種情況下,部分視圖是精靈)。只是建模實體(在屏幕上使用精靈表示)的「狀態」是冰山一角,其他屬性需要建模。 – trojanfoe

+0

@JuanChô:不幸的是,我沒有掌握所有你的代碼來檢查問題出在哪裏。我建議你做一些簡單的測試,並將其添加到我的答案中,並報告其結果。 – sergio