0

私はクラスを持っています:

class Mouse
{
public:
    int x;
    int y;
    void MouseMove( int x, int y );
    Mouse();
};

WndProc および WinMain 関数を含む windows.cpp のヘッダー ファイルとしてインクルードします。そのインクルードのすぐ下で、マウスの静的インスタンスを宣言します。

#include "Mouse.h"
#include "Game.h"

static Mouse mouse;

私のマウスメソッドは次のようになります:

#include "Mouse.h"

void Mouse::MouseMove( int x, int y )
{
    this->x = x;
    this->y = y;
}

私の WndProc では、WM_MOUSEMOUSE を処理し、x 値と y 値を渡しています (これらの値は、MouseMove 関数に渡されます)。

case WM_MOUSEMOVE:
            {

                int x = ( short )LOWORD( lParam );
                int y = ( short )HIWORD( lParam );


                bool leftButtonDown = wParam & MK_LBUTTON;
                bool rightButtonDown = wParam & MK_RBUTTON;

                mouse.MouseMove( x, y );

            }
            break;

私の MouseMove 関数が実行され、 this->x を x に正常に設定し、y 値と同じになります。これですべてです...完了です。

今、私の Windows ループで私は自分のゲーム (theGame.Go) を実行しています:

Game theGame = Game( hWnd );

    MSG msg;

    ZeroMemory( &msg, sizeof(msg) );

    while( msg.message!=WM_QUIT )
    {
       if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
       {
          TranslateMessage( &msg );
          DispatchMessage( &msg );
       }
       else
       {
            theGame.Go();
       }
    }

私のゲームのヘッダーは次のようになります。

#include "Mouse.h"

    class Game
    {
    public:
        Game( HWND hWnd );
        ~Game();
        void Go();
        void ComposeFrame();

        LPD3DXSPRITE sprite;
        LPDIRECT3DTEXTURE9 gTexture;
        D3DXVECTOR3 pos;
    private:
        D3DGraphics gfx;
    };

私のゲームの構成は次のようになります。

Game::Game( HWND hWnd )
    :
    gfx( hWnd )
{
    HRESULT result;

    sprite = NULL;
    result = D3DXCreateSprite( gfx.d3dDevice, &sprite );
    assert( !FAILED( result ) );

    gTexture = NULL;
    result = D3DXCreateTextureFromFile( gfx.d3dDevice, "Images/character001.png", &gTexture );
    assert( !FAILED( result ) );

    gfx.d3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
};

ゲーム オブジェクトは、windows.cpp で宣言されているマウス オブジェクトが、そこでグローバルに宣言されているにもかかわらず、存在することを認識していません。そこで、Game オブジェクトへの参照によってマウス オブジェクトを渡す必要があると考えました。Windows ループを次のように変更することから始めます。

Game theGame = Game( hWnd, &mouse );

    MSG msg;

    ZeroMemory( &msg, sizeof(msg) );

    while( msg.message!=WM_QUIT )
    {
       if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
       {
          TranslateMessage( &msg );
          DispatchMessage( &msg );
       }
       else
       {
            theGame.Go();
       }
    }

ここで、いくつかのパラメーターを Game.h クラスに追加して、メモリへの参照を取得し、後でそこから *mouse.x を取得できるようにします...:

class Game
{
public:
    Game( HWND hWnd, Mouse &mouse );
...

戻って Windows ループを確認すると、呼び出しの下に波線が表示されます。

Game theGame = Game( hWnd, &mouse );

それは次のように述べています:

6   IntelliSense: no instance of constructor "Game::Game" matches the argument list
        argument types are: (HWND, Mouse *) c:\Users\James\Documents\Visual Studio 2012\Projects\Game\Game\Windows.cpp  75  17  Game

理解できません?いったいどうやって、マウスの 1 つのグローバル インスタンスを変更し、それを私のゲーム オブジェクト内から呼び出すのでしょうか :(

4

2 に答える 2

1

エラーの原因となっている問題は、Gameコンストラクターが以下への参照を取得することMouseです。

Game( HWND hWnd, Mouse &mouse );

ただし、次のアドレスを使用してポインタを渡しています。Mousemouse

Game theGame = Game( hWnd, &mouse );

どちらか一方を変更できます。パラメータタイプをポインタ(Mouse* mouse)に変更するか、引数として渡しmouseます。

ただし、これはグローバルオブジェクトを持つための非定型のアプローチです。mouseとして宣言することによりstatic、内部リンクを付与し、他の翻訳ユニットからアクセスすることはできません。mouse一般的に行うことは、グローバルオブジェクトにアクセスする必要があるときはいつでもインクルードする単一のヘッダーファイルに次の宣言を含めることです。

extern Mouse mouse;

そして、単一の実装ファイルで定義を提供します。

Mouse mouse;
于 2013-03-20T23:41:05.423 に答える
1

Game::Gameへの参照を受け取るコンストラクターを宣言しましたMouseが、ポインターを渡しています。

次のように変更します。

Game::Game(HWND hWnd, Mouse* mouse);

また:

Game(hWnd, mouse);

Gameまた、コンストラクターを呼び出すときは、実際には不要なコピーを作成していることにも注意してください。

Game theGame = Game( hWnd, &mouse );

代わりに、これを次のように変更します。

Game theGame( hWnd, &mouse );
于 2013-03-20T23:36:56.253 に答える