选择器采用Cocos2d调度方法

时间:2011-06-18 22:51:40

标签: objective-c cocos2d-iphone selector

所以我这样做是为了初始化我的选择器:

//In .h

SEL selectors[3];

//In .m

selectors[0] = @selector(rotate);
selectors[1] = @selector(discharge);

问题在于:

当我在Cocos2d中的init方法中调用它时,如下所示:

[self performSelector:selectors[0]];

它工作正常,但是当我在一个名为moveThings的方法中调用这行代码时,它在Cocos2d的init方法结束时通过调度([self schedule:@selector(moveThings:)])调用,它给出了EXC_BAD_ACCESS。安排事情有什么问题?

更新:

我发现旋转功能有问题(该功能存储在选择器[0]中)。这是:

-(void)rotate:(ccTime)delta {
    if (((CCSprite *)[creature objectAtIndex:0]).rotation < 360) {
        ((CCSprite *)[creature objectAtIndex:0]).rotation++;
    }
    else {
        ((CCSprite *)[creature objectAtIndex:0]).rotation++;
    }
}

如果我评论方法的内容,当通过moveThings和init调用时,它可以正常工作。

如果我用以下方法更改方法内容:

((CCSprite *)[creature objectAtIndex:0]).rotation++;

它失败了...但是,我想再说一遍,如果我在我的init方法中调用它,所有这些东西都能正常工作,甚至连续两次调用它,但它不起作用(除非我取出rotate方法的内容)如果我通过moveThings:方法调用它,通过调度方法调用它失败。

进一步更新:

如果我打电话:

((CCSprite *)[creature objectAtIndex:0]).rotation++;

在moveThings中(正如我之前所说,由schedule:(SEL)方法调用),它失败了。只要没有通过调度方法调用它就可以工作。

4 个答案:

答案 0 :(得分:6)

问题是当你调用performSelector时,只有两个选项:

  1. 让你的选择器不带参数,并将“:”从@selector(foo)定义中删除。
  2. 让您的选择器采用一个或两个参数,这两个参数都必须是NSObject或子类
  3. 后者将你搞砸到我怀疑的地方。

    以下是performSelector的三种形式:

    - (id)performSelector:(SEL)aSelector;
    - (id)performSelector:(SEL)aSelector withObject:(id)object;
    - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
    

    你会注意到withObject参数都是{C}个类型,它是一个Objective C对象。

    您尝试使用的选择器需要一个id ccTime一个Objective C对象作为它的参数,这就是事情崩溃的原因:

    float

    一个选项是创建一个包装方法,该方法包含-(void)rotate:(ccTime)delta; 并解包并调用ccTime方法:

    rotate:(ccTime)

    然后使用

    - (void) wrappedRotate: (NSNumber*) inDelta
    {
        [self rotate: [inDelta floatValue]];
    }
    

    然后通过以下方式致电:

    selectors[0] = @selector(wrappedRotate:);
    

    您感到困惑的一个原因是因为Cocos2d以更复杂的方式使用@selector(请参阅CCTimer :: initWithTarget中的CCScheduler.m:选择器:interval:特别是CCTimer :: update:方法)。

    免责声明:代码输入SO所以不用编译器检查,但你需要的本质应该在这里。

答案 1 :(得分:0)

确定的一个问题是,您在.h内使用声明的变量,同时在相对.m内初始化它。根据链接,我不确定只存在一个变量selectors(因此包含.h的不同文件将具有不同的版本)。

首先,我建议您尝试添加关键字extern以便

extern SEL selectors[3];

告诉您的链接器它已在相对.m内初始化并仅使用该链接器。

答案 2 :(得分:0)

我认为您的问题源于您的方法定义- (void)rotate;而非- (void)rotate:(ccTime)dt;

您应该同样调整选择器。

答案 3 :(得分:0)

如果你的方法没有任何参数,那么不要在你的选择器调用中使用冒号。

// Requires @selector(foo:)
- (void) foo:(id)sender;
// Requires @selector(foo)
- (void) foo;