2013-03-20 70 views
0

我有一個類:混淆自己與指針和引用,C++(從WinAPI的入門鼠標COORDS)

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功能貫穿而設置這個 - > X成功x和同一個Wi y值。這一切都完成了。

現在,在我的窗戶循環我正在我的遊戲(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); 
... 

我回去看看我的窗戶循環,並有一個波浪下我的電話:

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

你已經聲明你的Game::Game構造函數引用Mouse,但你傳遞它的指針。

要麼改變:

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

或:

Game(hWnd, mouse); 

還要注意的是,當你打電話給你Game構造函數,你實際上是在做不必要的副本:

Game theGame = Game(hWnd, &mouse); 

相反,將其更改爲:

Game theGame(hWnd, &mouse); 
+0

我已經完成了這個鼠標*鼠標...和我的遊戲方法以外的構造函數不能看到這個對象,所以我在我的Game.h中聲明瞭一個鼠標鼠標,然後將構造函數默認值設置爲鼠標(鼠標)我的intellisense關閉它的pube看起來很小,但mouse.x和y仍然沒有通過,不管我現在的事實如何有一個類的本地版本呢? – Jimmyt1988 2013-03-20 23:57:20

+0

HANGON,完成它:D yahooooo ... – Jimmyt1988 2013-03-21 00:01:12

+0

我現在設法改變它,所以在我的Windows循環中我稱之爲遊戲theGame(hWnd,鼠標);然後我在我的遊戲構造參數中收到一個參考。這個工程也很棒! – Jimmyt1988 2013-03-21 00:11:13

1

這是造成你的錯誤的問題是,你的Game構造函數採用參考Mouse

Game(HWND hWnd, Mouse &mouse); 

你,但是,通過採取mouse地址傳遞指針Mouse

Game theGame = Game(hWnd, &mouse); 

您可以更改一個或其他:將參數類型更改爲指針(Mouse* mouse)或將mouse作爲參數。

但是,這是具有全局對象的非典型方法。通過聲明mousestatic,您可以將其設爲內部鏈接,並且不能在任何其他翻譯單元中訪問它。你通常會做的是有一個頭文件如下聲明它時,你需要進入全球mouse對象,你將包括:

extern Mouse mouse; 

然後在一個單一的實現文件提供的定義:

Mouse mouse; 
+0

我添加了一個名爲Globals.h的頭文件,其中我放置了一次#pragma和extern鼠標鼠標。在我的Windows.cpp中,我包含了#Globals.h,並且還包含在我的遊戲文件中...在我的Windows.cpp中,我製作了一個鼠標鼠標的實例。現在在我的遊戲中,對象x和y出現爲 - \t鼠標{x = -858993460 y = -858993460},它們不變。 – Jimmyt1988 2013-03-20 23:49:52

+0

在我的MouseMove函數中,x和y仍然正確傳遞,但是我的Game對象再次看不到它們的值..只有-859blabla的NULL值等等。我可以通過你我的項目嗎? – Jimmyt1988 2013-03-20 23:52:20