2010-10-14 126 views
1

我正在爲2-4名可可球員製作一個簡單的遊戲。這是我的第一個Cocoa應用程序,所以不熟悉這些庫,我可能會做很多奇怪的事情。如果你看到任何可以做得更好的東西,就這麼說吧。如何以編程方式創建視圖對象?

第一步要求用戶從NSPopUp中選擇玩家人數,並將數據拉入到一個int中。我創建了一個數組並循環播放多個播放器對象。

- (IBAction)startGame:(id)sender { 

// Get value of playersPopup into a string 
NSString *playersReturn = [[NSString alloc] initWithString:[playersPopup titleOfSelectedItem]]; 

// Convert that string to an int 
numberOfPlayers = [playersReturn intValue]; 

// Create an array 
playerArray = [[NSMutableArray alloc] init]; 

// Create a counter 
int i = 0; 

// While counter is less than number of players, create player object and add to array 
while (i < numberOfPlayers) { 

    // Create a player object 
    Player *player = [[Player alloc] init]; 

    // Add player to array 
    [playerArray addObject:player]; 

    // Increment 
    i++; 

} 

}

這是一個有點古怪,因爲所有的對象都具有相同的名稱。我不知道如何以編程方式使用像player1等計數器給對象一個標題,但它很容易從objectAtIndex的數組中通過鍵來拉動它們。這將是我的問題的第一部分:在可可如何使用計數器命名對象?因爲從我收集如果我這樣做:

player *player[i] = 

它會創建一個對象的數組時,所有我想要做的就是把它PLAYER1等

第二個問題是:我在哪裏,之後另一種觀點玩家對象被創建,用戶看到NSTextFields爲玩家輸入名字。鑑於我應該在AppDelegate中聲明IBOutlets,我不確定如何提供2-4名玩家。我可以聲明所有4個插座並只使用兩個插座,然後以編程方式隱藏未使用的文本字段。但似乎應該有一種方法可以根據選擇的玩家數量創建出售點和查看對象。我的意思是我有整個AppDelegate int,所以我應該以某種方式使用它。

如果有人不介意指點我一個好方向,那太棒了!我非常喜歡Cocoa的編程,但在這點上它有着不同的世界。我知道會有一條學習曲線,但它與.net真的不同!

謝謝你們!

-Alec

+0

剛發現的迭代器...關於如何使用它們的想法? – 2010-10-14 22:35:45

+0

不要忘記釋放您創建的對象(例如,該循環中的Player對象)。在這種情況下,「迭代器」是什麼意思? – 2010-10-15 00:15:21

+0

哦,另外,你通常不需要用另一個NSString實例化一個NSString(就像你在初始化程序中爲那個代碼中的'playersReturn'做的那樣)。它已經是一個NSString。你唯一可以做的就是當你將NSString轉換成NSMutableString或從NSMutableString轉換出來時 - 即使這樣,通常使用'copy'或'mutableCopy'也會更有意義。此外,由於這是一個局部變量,所以創建自己的副本(單向或雙向)意味着您需要在方法結束時釋放或自動釋放副本,否則,正如我所提到的,您正在泄漏該對象。 – 2010-10-15 04:43:01

回答

0

這是一個有點古怪,因爲所有的對象都具有相同的名稱。我不知道如何以編程方式使用像player1等計數器給對象一個標題,但它很容易從objectAtIndex的數組中通過鍵來拉動它們。這將是我的問題的第一部分:在可可如何使用計數器命名對象?

你不知道。除了幾個專門爲命名對象提供API的類(例如,NSThread)之外,沒有辦法命名對象。

你在說什麼是聲明變量,其中包含指向對象的指針。這些變量與對象本身是分開的;你甚至可以有多個變量都指向同一個對象。命名變量不會影響它可能指向的對象的任何內容。

因爲從我收集如果我這樣做:

player *player[i] = 

它會創建一個對象的數組時,所有我想要做的就是把它PLAYER1等。

否,那就聲明名爲player作爲保持的i指針C數組到player對象變量。如果不是無效的話,它也會變得毛茸茸的,因爲你使用player兩個不同的東西(一個類和一個指針變量)。

假設你有你的願望,並可以創建一堆名爲player0player1player2等變量。你將如何處理所有這些變量?更重要的是,你將如何與他們一起工作?你如何讓每個觀點成爲不同的球員?你如何將每個視圖放到不同的地方?你如何將消息發送到需要更新的單個特定視圖?

你的問題的正確解決方案是第二個NSMutableArray:這一個視圖。將視圖放入該陣列中,就像將模型對象放入播放器陣列一樣。您可以維護這些數組,使得每個索引引用一個數組中的模型對象,並引用另一個數組中的對應視圖 - 例如,如果您收到操作消息,則會查找該視圖的索引views數組,然後通過播放器數組中的該索引獲取模型對象以響應該動作。

該解決方案更強大的變體,但也有更多的工作,將循環播放視圖陣列搜索具有特定播放器的視圖。這個解決方案不需要它們具有相同的順序,並且使您能夠處理其玩家從模型陣列中缺失的玩家視圖(不應該發生)的情況。但是,正如我所說的,這對您和程序來說都是更多的工作(即速度更慢)。我可能只是做平行陣列。

我的意思是我有整個AppDelegate整數,所以我應該以某種方式使用它。

你不需要它。

首先,它是錯誤的類型。 NSArrays的索引編號和計數的正確類型是NSUInteger

更重要的是,一旦您添加了所有玩家,該數字就包含玩家人數。您可以通過向播放器陣列發送一條count消息來輕鬆獲取該信息。如果你對你有多少玩家保持不同的知識,那麼你可能會因爲添加或移除玩家而忘記更新自己的計數變量而導致錯誤。

刪除該變量。當你需要知道你有多少玩家時,只需詢問陣列。

至於限制您添加的玩家數量:將玩家人數複製到本地變量並將其計數。當它達到零時,你已經添加了你需要的所有玩家。或者,你也可以減少開局時間,增加兩個玩家,並且讓用戶可以隨意添加其他玩家。

+0

非常感謝。真的,這超出了我的預期。首先,感謝您澄清關於命名變量。我在黑暗中,但你解釋清楚了。事實上,在試圖從視圖和模型中抽取字符串時,我偶然發現了使用兩個相應數組的方法。在這個特殊情況下,它只是一個字符串數組,在循環進入模型後被釋放。擁有一系列視圖是非常有意義的,顯然這消除了對具有唯一變量名稱的需求,因爲它們意味着有相應的鍵... – 2010-10-15 02:59:47

+0

我沒有得到的是如何在創建播放器對象之前消除numberofPlayers變量。我必須從視圖中拉出某些東西,否則創建播放器對象並將它們粘貼到數組中的while循環將不知道何時停止。在創建對象後,我可以看到使用[playerArray count],但在數組填充之前如何擺脫它? 另外,我喜歡最後一種方法,只是直接創建兩個球員,然後讓他們以後再添加其他球員。這看起來好設計和代碼明智。再次感謝彼得。 – 2010-10-15 03:06:46

+0

從2位玩家開始,順便清理代碼。感謝那。 – 2010-10-15 03:12:56