0

我有一堂课:

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

我将它作为头文件包含到我的 windows.cpp 中,其中包含 WndProc 和 WinMain 函数。就在它的下面,我声明了我的鼠标的一个静态实例:

#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

我不明白?我到底如何只更改鼠标的一个全局实例并从我该死的游戏对象中调用它:(

4

2 回答 2

1

您已将Game::Game构造函数声明为对 a 的引用,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 回答
1

导致您的错误的问题是您的Game构造函数引用Mouse

Game( HWND hWnd, Mouse &mouse );

但是,您通过以下地址传递一个指针Mousemouse

Game theGame = Game( hWnd, &mouse );

您可以更改其中之一:将参数类型更改为指针 ( Mouse* mouse) 或作为参数传递mouse

但是,这是拥有全局对象的非典型方法。通过声明mouseas static,您将为其提供内部链接,并且无法在任何其他翻译单元中访问它。您通常会在单个头文件中包含以下声明,当您需要访问全局mouse对象时,您将包含该声明:

extern Mouse mouse;

然后在单个实现文件中提供定义:

Mouse mouse;
于 2013-03-20T23:41:05.423 回答