使用iterateFunc调用目标c方法

时间:2010-06-12 20:28:57

标签: objective-c cocos2d-iphone chipmunk

使用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]; 
}

谢谢,为你的答案付出了代价,并帮助我在将来制作更好的问题。

1 个答案:

答案 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];
}