2010-06-12 61 views
0

使用空间管理器,我需要在每个步骤之后对选定的实体执行一个操作,所以我认为为iterateFunc定义我自己的C函数将是一条可行的路。使用iterateFunc调用目标c方法

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

任何想法,或更好的方式去做事情?

更新:

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

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

在同一个班级,一个“doThisFunc”功能可以宣布。

在spacemanager,这iterateFunc从“阶梯”的方法叫:

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

所以,我首先想到的是子类spacemanager,在我的自定义步骤方法,调用cpSpaceHashEach用我自己的类,而不是自我(太空管理员,就是这样)。在那边的一半,我意识到我甚至不需要这样做,因为子类化和定义我自己的步骤方法是我所需要做的。我的新步骤方法:

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

非常感谢,您的答案都可以提供,并帮助我在将来制定更好的问题。

回答

1

神圣的模糊,蝙蝠侠,哪里的代码片段?幸运的是,Google的魔力保存了一天。

要回答这个问题,需要详细的几位:

什么是iterateFunc的声明?

哦。这是一个cpSpaceHashIterator。没有帮助。

啊......那里是:

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

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

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

像这样:

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

然后你的迭代FUNC可以这样做:

void iteratorFunc(void *obj, void *data) { 
    [(MyClass *)data iterateThis: obj]; 
} 
+0

感谢您的投入,你是对的,我的原始代码严重缺乏。从iPad发布信息,无法访问我的XCode,以后再也无法添加代码。对那些试图帮助我的人没有帮助。对于那个很抱歉。然而,为了添加一些代码,除了事实上,在Spacemanager中重新分配iteratorFunc的方法是通过简单的属性赋值,我想到的正是你所提到的。 smgr.iteratorFunc = doThisFunction; 没有指定参数或任何东西。当然,我可以继承,但我想知道是否有更清晰的方式让我失踪。 – 2010-06-13 01:25:31

+0

需要更多的代码;我发现唯一的空间管理者是纯粹的C,并且始终保持“void *”......当你说'smgr.iteratorFunc = doThisFunction'时,上下文是什么以及后面的行为如何触发? – bbum 2010-06-13 03:28:51