0

使用 spacemanager,我需要在每一步之后对选定的主体执行一个操作,所以我认为为 iterateFunc 定义我自己的 C 函数将是可行的方法。

一切都很好,除了我不确定如何在同一个类中调用 obj c 方法。换句话说,一个 obj c 类既包含替换 iterateFunc 的 c 函数,也包含需要调用的方法。我不知道如何告诉 c 函数“自我”是什么,以便我可以调用该方法。据我所知,没有办法将任何额外信息传递给新的 iterateFunc。

有什么想法,或者更好的处理方式吗?

更新:

感谢您的回复。声明一个新的 spacemanager,可以重新定义它的 iterateFunc:

smgr = [[SpaceManager alloc] init];
smgr.iterateFunc=doThisFunc;

在同一个类中,可以声明一个“doThisFunc”函数。

在 spacemanager 中,这iterateFunc是从“step”方法调用的:

 -(void) step: (cpFloat) delta
{
.....
    cpSpaceHashEach(_space->activeShapes, _iterateFunc, self);
....
}

所以我的第一个想法是继承spacemanager,并在我的自定义步骤方法中,cpSpaceHashEach使用我自己的类而不是self(即spacemanager)调用。到了一半,我意识到我什至不必这样做,因为我需要做的只是子类化和定义我自己的 step 方法。我的新步骤方法:

-(void) step: (cpFloat) delta
{       
    [super step:delta];
    //Having of course set the "myObject" variable elsewhere as my other object
    [myObject doThis]; 
}

谢谢,bbum 你的回答,并帮助我在未来提出更好的问题。

4

1 回答 1

1

神圣的模糊,蝙蝠侠,代码片段在哪里?值得庆幸的是,谷歌的魔力拯救了这一天。

要回答这个问题需要一些细节:

iterateFunc 的声明是什么?

哦。它是一个cpSpaceHashIterator. 没有帮助。

啊……就是这样:

typedef void (*cpSpaceHashIterator)(void *obj, void *data);

看起来这个void *data论点就是你的答案。具体来说,它看起来像是透明地传递给您的迭代器函数。也就是说,如果你打电话:

cpSpaceEachBody(cpSpace *space, cpSpaceBodyIterator func, void *data)

像这样:

cpSpaceEachBody(space, funcPtr, (void *)self);

然后你的迭代器函数可以这样做:

void iteratorFunc(void *obj, void *data) {
    [(MyClass *)data iterateThis: obj];
}
于 2010-06-12T21:04:48.767 回答