1

同じ基本クラスから継承された 2 つのクラスがあります。これはゲーム ループ用であり、現在の「状態」に応じて、CALLBACK メソッドでアクティブ オブジェクトへのポインターを送信する必要がありますが、そうではありません。2 番目のオブジェクトのポインターのみを送信します。

最初に PostMessage() を介して ObjectA を設定し、次に ObjectB を設定すると、ObjectB が機能しなくなり、そのオブジェクトへのポインターが取得されません。

逆に設定すると、ObjectB は機能しますが、ObjectA は機能しません。

これはループの一般的なレイアウトです: (何が欠けているのでしょうか?)

ゲームループ:

PostMessage( hwnd, WM_USER, 0, (LPARAM)&ObjectA );
PostMessage( hwnd, WM_USER, 0, (LPARAM)&ObjectB );

while(running)
{
    while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    {
        /* ... */
    }

    if (STATE == StateA)
    Update(&ObjectA);

    if (STATE == StateB)
    Update(&ObjectB);
}

コールバック メソッドで:

static ObjectA* objA;
static ObjectB* objB;

if (objA || objB)
{
    // Do stuff to objA or objB
}
else
    switch(msg)
    {
        case WM_USER:

        if (STATE == StateA)
            objA = (ObjectA*) lparam;

        if (STATE == StateB)
            objB = (ObjectB*) lparam;
        break;

        // default and WM_CLOSE
    }
}
4

1 に答える 1

0
while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
{
    /* ... */
}

確認すると、コードは次のことを行う可能性が高くなります。

  1. すべてのメッセージを繰り返し処理し、1 つずつ破棄します
  2. すべてのメッセージが「処理」された後、最後のメッセージのパラメーターを使用して Update を呼び出します。これは (私が推測するに) 「/* ... */」ブロックで読み取られます。

このバリエーションを試してみませんか?

while(running)
{
    while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    {
        /* ... */

        if (STATE == StateA)
        Update(&ObjectA);

        if (STATE == StateB)
        Update(&ObjectB); // Note the "Update" callbacks moved to inner loop
    }
}
于 2012-11-12T07:16:14.153 に答える