2014-04-09 79 views
0

我最近開始自學Obj-c並開展了一個大型項目,以學習語言的原理。我正在做一個14瓦的棋盤遊戲。現在放置這些我覺得最好把每個瓷磚的座標放在.plist中,訪問這個信息然後返回每個座標。所以plist看起來像這樣:Obj-c座標數組 - 最佳實踐?

root ---> position on board ---> item 0 ---> TileX(number(4)),Tile y(number(12))--->第1項...等。等多達13

現在,在代碼中,我有這個作爲

NSString *path = [[NSBundle mainBundle] bundlePath]; 
NSString *finalPath = [path stringByAppendingPathComponent:@"WheelData.plist"]; 
NSDictionary *plistData = [NSDictionary dictionaryWithContentsOfFile:finalPath]; 
NSArray *positionOnBoard = [NSArray arrayWithArray:[plistData objectForKey:@"Position On Board"]]; 

int numberOfPositions = [positionOnBoard count]; 

NSMutableArray *PositionX; 
NSMutableArray *PositionY; 
NSMutableArray *arrayOfPositionsX = [[NSMutableArray alloc] initWithCapacity:numberOfPositions]; 
NSMutableArray *arrayOfPositionsY = [[NSMutableArray alloc] initWithCapacity:numberOfPositions]; 
for (int d = 0; d < numberOfPositions; d++) { 
    [arrayOfPositionsX addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile X"]]; 
    [arrayOfPositionsY addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile Y"]]; 
    PositionX = [NSMutableArray arrayWithArray:arrayOfPositionsX]; 
    PositionY = [NSMutableArray arrayWithArray:arrayOfPositionsY]; 

    if (d == 0) { 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 1) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 2) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 3) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 4) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 5) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 6) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 7) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 8) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 9) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 10) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 11) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else if (d == 12) { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } 

} 
return PositionX; 
return PositionY; 

現在很明顯,此刻我只是nslogging這個,所以我讓每個分片返回其兩個X值和Y值。我最終會將這種情況繪製到某種CGRectMake網格上,然後使用圖像在視圖控制器上顯示。正如我所說,我是新來的,仍然在學習。有沒有簡單的方法來做到這一點?更好的方法?我真的很感激反饋,謝謝!

+1

這個問題可能會更好在StackExchange - 在那裏更廣泛的編程討論發生。 AFAIK,StackOverflow用於解決特定問題。 。 。話雖如此,爲什麼不創建一個代表你遊戲概念的豐富模型呢?即是否有**董事會**,由一組**職位**組成?然後,您可以使用ActiveRecord或DAO模式從持久存儲(平面文件,本地數據庫,雲等)加載此模型。 –

+0

我不完全確定你需要用瓷磚做什麼。它們是否始終處於固定的網格佈局(例如,2行7列),但各個圖塊的位置是否更改?如果是這種情況,那麼使用二維數組來保存遊戲板的佈局可能會更簡單。或者,瓷磚可以在空間的任何位置移動,因此您需要精確的X和Y座標?在這種情況下,您可能會考慮將X和Y座標(以及大小)存儲在一個NSRect中,因爲在繪製切片時會爲您節省一個步驟。 – nonex

+0

對不起,應該更好地解釋它!這些座標表示六邊形圖像的中心點(因爲它們具有屬性,所以稍後可能會有對象),所以在網格上將設置14個六邊形。現在我需要這樣做,而不是僅僅製作一個背景圖片,因爲這些貼圖會根據所選規則對遊戲玩法產生影響。我不確定這是否能夠澄清任何事情。 :) – JonHerbert

回答

5

您可以簡單地將格式爲{10,10}的位置串添加到您的plist文件中.... 因此,您的plist結構將如下所示;

<plist version="1.0"> 
<array> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
    <string>{10,10}</string> 
</array> 
</plist> 

然後,如下訪問數據;

NSArray *positionsArray = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Page" ofType:@"plist"]]; 

上面的數組將保存NSString格式的所有位置。您可以從這些NSStrings中生成一個CGPoint。 您可以直接使用這些CGPoint來定位您的瓷磚,或者甚至可以根據需要分離出X和Y座標。請找到下面的代碼片段;

int count = 0; 
for(NSString *strPos in positionsArray) 
{ 
    count++; 
    CGPoint position = CGPointFromString(strPos); 
    NSLog(@"Position %d -> X:%f Y:%f",count,position.x,position.y); 
} 
+0

我很喜歡這個樣子,謝謝! – JonHerbert

0

從上面的評論繼續:

我假設網格是六角形太多,所以這將是2,3,4,3,2等於14瓦的行。如果它是一個網格,並且網格的物理位置將始終是網格中的離散位置之一,我認爲您不需要存儲每個圖塊的X和Y座標。您可以將它們在網格中的位置存儲在二維數組中,並有一種方法可以繪製板並將其放置在網格中的相應位置。除此之外,存儲每個圖塊的中心X和Y座標沒有什麼意義(除非您因某種原因需要)。由於繪圖座標是從左下角開始的,因此您應該將每個六邊形視爲矩形內存在並存儲左下角的X和Y座標。顯然,矩形的行將需要重疊一點,以便瓷磚貼合在一起(如果我對網格的假設是正確的)。

至少,您應該重新考慮您的代碼中的for循環。對於每個迭代而言,有一個if語句會使得for循環的目的失敗,並且完全沒有必要考慮每個else if語句完成同樣的事情。你可以清理它看起來像這樣:

for (int d = 0; d < numberOfPositions; d++) { 
    [arrayOfPositionsX addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile X"]]; 
    [arrayOfPositionsY addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile Y"]]; 
    PositionX = [NSMutableArray arrayWithArray:arrayOfPositionsX]; 
    PositionY = [NSMutableArray arrayWithArray:arrayOfPositionsY]; 

    if (d == 0) { 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } else { 
     [arrayOfPositionsX removeObjectAtIndex:0]; 
     [arrayOfPositionsY removeObjectAtIndex:0]; 
     NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY); 
    } 
} 
+0

你是完全正確的網格形狀,我看着我的手繪六邊形網格的圖片,它確實是2,3,4,3,2。我總是把行和列看作一個正方形或矩形的表格,但是這對我的項目很有意義。我沒有意識到繪圖座標從左下角開始,這真的很好知道!也沒有任何其他的if語句,您也可以接受關於for循環的建議! – JonHerbert

+1

我也應該說''for''循環做什麼是不必要的(正如上面提到的那樣),因爲你正在向一個數組添加一個對象,'NSLog',然後立即刪除它。 – nonex

+0

就像原來的代碼一樣,'PositionX'和'PositionY'沒有做任何事情。這個代碼沒有必要。 – ThomasW