使用spacemanager,我需要在每一步之后对select body执行一个动作,所以我认为为iterateFunc定义我自己的C函数将是最佳选择。
一切都很好,除了我不知道如何在同一个类中调用obj c方法。换句话说,obj c类包含替换iterateFunc的c函数和需要调用的方法。我不知道如何告诉c函数'self'是什么,这样我就可以调用该方法。据我所知,没有办法将任何额外的信息传递给新的iterateFunc。
任何想法,或更好的方式来处理事情?
更新
感谢您的回复。声明一个新的太空管理器,可以重新定义它的iterateFunc:
smgr = [[SpaceManager alloc] init];
smgr.iterateFunc=doThisFunc;
在同一个类中,可以声明“doThisFunc”函数。
在太空管理员中,从“步骤”方法调用此iterateFunc
:
-(void) step: (cpFloat) delta
{
.....
cpSpaceHashEach(_space->activeShapes, _iterateFunc, self);
....
}
所以我的第一个想法是将spacemanager子类化,并且在我的自定义步骤方法中,用我自己的类调用cpSpaceHashEach
,而不是self(spacemanager,即)。在那里,我意识到我甚至不必这样做,因为继承和定义我自己的步骤方法就是我需要做的。我的新步骤方法:
-(void) step: (cpFloat) delta
{
[super step:delta];
//Having of course set the "myObject" variable elsewhere as my other object
[myObject doThis];
}
谢谢,为你的答案付出了代价,并帮助我在将来制作更好的问题。
答案 0 :(得分: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];
}