(id)发件人如何在cocos2d中工作?

时间:2013-06-14 10:56:06

标签: objective-c cocos2d-iphone

以下代码对我有用:

在菜单层的init方法中:

CCMenuItemFont *item1 = [CCMenuItemFont itemWithString:@"Level 1" target: self selector: @selector(startLevel:)];
item1.userData = (__bridge void*) ([NSNumber numberWithInt:1]);
...//create menu and add in the item1


-(void)startLevel: (CCMenuItem *)sender
{
    NSNumber *number = sender.userData;
    ...
}

我的问题是:

  • 调用方法startLevel时我没有传递item1:它如何知道发件人是item1?
  • 是否写入选择器?还是用可可写的?

2 个答案:

答案 0 :(得分:2)

CCMenuItem将自身作为参数传递给此选择器。详细信息在CCMenuItem源代码中。

答案 1 :(得分:0)

关于省略将自身作为参数传递,你的意思是......

- (void) pushedStart : (id) sender
{
    //start game
}

但你做不到

[self pushedStart];

因为它需要一个参数?如果是这样,你可以做到这一点:

id junkID;
[self pushedStart: junkID];

JunkID将初始化为未分配的ID分配到的任何内容,因此您将其作为参考传递,并且不要将其用于任何内容,如果您想要“开始游戏”按钮但这很好让游戏自动启动计时器或你用按钮做的其他事情

作为旁注,并且越来越多地了解可可,它知道的方式(以及你不能忘记的)是结肠。当你调用一个函数时,你把变量放在冒号之后[self eat:food];

当您将菜单项放在一起时,使用target:self设置它,这使得按钮使用自身(而不是您在调用[self eatABanana]时使用的“self”图层)作为目标。按下按钮

menuButton = target:self selector:@selector(pushButton:) 

表示为

[self pushButton:menuButton] 

如果您忘记了冒号,它与调用函数并且不传递变量相同,这不会给出非常有用的错误消息,因为它无法帮助您找到问题发生的位置。我花了几个小时追逐因为在那些该死的菜单按钮中编写@selector(startGame)而不是@selector(startGame :)而造成的内存崩溃。当我终于明白时,我总觉得很蠢。