gpt4 book ai didi

objective-c - Cocos2d调度方法中的选择器

转载 作者:行者123 更新时间:2023-12-04 02:35:26 24 4
gpt4 key购买 nike

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

//In .h

SEL selectors[3];

//In .m

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

问题是这样的:

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

[self performSelector:selectors[0]];

它工作正常,但是当我在名为 moveThings 的方法中调用这行代码时,该方法是通过计划 ([self Schedule:@selector(moveThings:)]) 在末尾调用的我在 Cocos2d 中的 init 方法给出了 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 方法中调用它,所有这些事情都会起作用,甚至连续调用它两次,但它不会起作用(除非我取出旋转方法的内容)如果我通过 moveThings: 方法调用它,而该方法是通过计划方法调用的,则会失败。

进一步更新:

如果我打电话:

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

在 moveThings 中(正如我之前所说,它由 schedule:(SEL) 方法调用)失败。只要它不是通过计划调用的方法调用,它就可以工作。

最佳答案

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

  1. 让您的选择器不带任何参数,并在 @selector(foo) 定义中保留“:”。
  2. 让您的选择器采用一个或两个参数这两个参数都必须是 NSObject 或子类

我怀疑是后者让你陷入困境。

以下是performSelector的三种形式:

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

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

您尝试使用的选择器采用一个ccTime,它是一个float,并且不是一个 Objective C 对象,因为它是参数,并且这就是事情崩溃的原因:

-(void)rotate:(ccTime)delta;

一种选择是创建一个包装器方法,该方法接受包装的 ccTime 并将其解开并调用 rotate:(ccTime) 方法:

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

然后使用

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

然后通过以下方式调用:

[self schedule: @selector(moveThings:)]);  // cocos2d schedule

...

- (void) moveThings: (ccTime) dt
{
[self performSelector: selectors[0] withObject: [NSNumber numberWithFloat: dt]];
...
}

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

免责声明:代码输入到 SO 中,因此未使用编译器进行检查,但您需要的本质应该在这里。

关于objective-c - Cocos2d调度方法中的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6399378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com