0

spacemanagerを使用して、各ステップの後に選択したボディに対してアクションを実行する必要があるため、iterateFuncに対して独自のC関数を定義することが道であると考えました。

同じクラスでobjcメソッドを呼び出す方法がわからないことを除いて、すべてがうまく機能します。つまり、obj cクラスには、iterateFuncを置き換えるc関数と、呼び出す必要のあるメソッドの両方が含まれています。メソッドを呼び出すことができるように、c関数に「自己」が何であるかを伝える方法がわかりません。私の知る限り、新しいiterateFuncに追加情報を渡す方法はありません。

何かアイデア、または物事を進めるためのより良い方法はありますか?

アップデート:

返信ありがとうございます。新しいスペースマネージャーを宣言すると、その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)ではなく、自分のクラスを使用して呼び出します。途中で、自分のステップメソッドをサブクラス化して定義するだけで十分だったので、それを行う必要さえないことに気づきました。私の新しいステップ方法:

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

あなたの答えと、将来もっと良い質問を作るのを手伝ってくれてありがとう。

4

1 に答える 1

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);

次に、イテレータ関数はこれを行うことができます:

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