2010-10-14 118 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