2010-06-12 63 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