1

私は現在、C# から C++ に移行し、いくつかのゲーム エンジン コードを書き直しています。基本的に私がやりたいことは、入力レイヤーがタッチスクリーンから入力を取得し、コールバックを起動して、その入力をリッスンしている要素に通知することです。現在、 tr1/boost はfunctionbindを使用してこれを非常に簡単にしているように見えますが、 void() であるコールバックを起動することは問題ありませんが、呼び出し時にこれらのコールバックにパラメーターを送信しようとしています (たとえば、列挙型) .

ここでの問題は、バインドを呼び出してパラメーターを挿入すると、プレースホルダーとして機能せず、渡される永続的な値として機能することです。たとえば、私のコードは次のとおりです。

含まれるクラス:

tr1::function<void (MenuActions action)> callback;
callback = tr1::bind(&MenuScene::handleInputCallback, this, MenuActions::neutral);
m_menuUILayer->registerCallback(callback);

関数を作成してバインドし、registerCallbackがこのコールバックをメンバー クラスに渡し、参照を格納するという意図があります。この部分は機能しますが、メンバークラスでコールバックを呼び出すことができますが、デフォルトのパラメーターは常に送信されます...

メンバー クラス:

if (m_callback)
{
    m_callback(MenuActions::backgroundTouchDown);
}

したがって、ここでは、MenuActions::backgroundTouchDownがコールバックでメインを含むクラスに送信されるのではなく、デフォルトのMenuActions::neutralが引き続き使用されます。何かが足りないのか、それとも睡眠不足が原因で間違った方向に進んでいるのだろうか? みんなありがとう!

4

1 に答える 1

5

プレースホルダーを使用する必要があります

callback = tr1::bind(&MenuScene::handleInputCallback, this,
tr1::placeholders::_1);

そして、次のように呼び出します

if (m_callback)
{
    m_callback(MenuActions::backgroundTouchDown);
}

そして、あなたの関数handleInputCallbackはデフォルトのパラメータを持つことができ、デフォルトでMenuActions::neutral

于 2013-03-11T06:51:09.230 に答える