2012-12-25 64 views
2

我有一個遊戲我工作的一個功能:C++圖形與BitBlt函數

void DrawMap() 
{ 
BITMAP bm; 
PAINTSTRUCT ps; 
HBITMAP sprites = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_COLOR_SPRITES)); 
HDC hdc = BeginPaint(hWnd, &ps); 
HDC hdcMem = CreateCompatibleDC(hdc); 
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, sprites); 
GetObject(sprites, sizeof(bm), &bm); 

// Find x and y coordinate for the top left of the visible screen 
int x = 4, y = 4, ypos = 0; 

// Draw lower layer 
for (int i = 0; i < 9; i++) 
    for (int j = 0; j < 9; j++) 
     BitBlt(hdc, (i * 32) + 36, (j * 32) + 36, 32, 32, hdcMem, game.get_pos(game.Layer_One[x + i][y + j], ypos), ypos, SRCCOPY); 

// Draw upper layer 
for (int i = 0; i < 9; i++) 
    for (int j = 0; j < 9; j++) 
     if (game.Layer_One[x + i][y + j] != 0) 
      BitBlt(hdc, (i * 32) + 36, (j * 32) + 36, 32, 32, hdcMem, game.get_pos(game.Layer_One[x + i][y + j], ypos, true), ypos, SRCCOPY); 

SelectObject(hdcMem, hbmOld); 
DeleteDC(hdcMem); 
EndPaint(hWnd, &ps); 
} 

變量「遊戲」是一個類的實例,我提出來存儲所有的遊戲VAR和funcs中。基本上,這兩個分組循環應該做的是創建一個雙層,9×9的32×32像素的網格,這是從一個地方的所有瓷磚的圖像複製。我測試了我的get_pos()函數,並且它返回完整精靈位圖中部分位圖的正確x和y位置。
get_pos的第二個參數()是通過參考 - 因此它可以給一個Y值這種方式,並返回一個x值。 出於某種原因,我的功能,雖然看起來正確地設置給我(並且明確地稱爲),但不會在hWnd上產生任何圖形。我做錯了什麼?

+0

另外,是行:?? GetObject的(精靈,的sizeof(BM),&bm); 必要 –

+0

是否顯示位圖,如果你直接選擇位圖到窗口DC如果是這樣,它仍然顯示,如果你選擇它到內存DC和BitBlt的這一切到窗口DC? – chris

+2

是'DrawMap()'從'WM_PAINT'處理函數調用,或其他時刻窗口的至少部分已經失效?否則,設備上下文建通過'調用BeginPaint()'將其裁剪區域設置爲整個窗口,並借鑑它不會有任何效果。 –

回答

-1

它不直接回答你的問題,但如果你不需要用很舊版本的Windows兼容,爲什麼不使用Direct2D的? GDI非常被棄用(更不用說慢)。

+2

-1:GDI既不緩慢也不被棄用。如果有的話,在原始問題的背景下執行'BitBlt'的問題,GDI可能會更快。這甚至不考慮構建Direct3D設備的非平凡成本。此外,GDI是渲染像素完美圖形的唯一方式(這也是OP顯然在做什麼之後)。 Direct2D有其用途,主要是將2D渲染與Direct3D混合使用。然而,這不是Direct2D提供任何好處的情況之一。 – IInspectable

+1

很顯然,這個問題暗示了在遊戲環境中的使用,而不僅僅是將某些東西放在窗口上。 的Direct2D不需要與Direct3D的瞎任何做這樣的事情上面。至於GDI和折舊 - 也許這是一個有點太強大了,但是: http://msdn.microsoft.com/en-us/library/windows/desktop/ff729480%28v=vs.85%29.aspx – Brandon

+1

**您不必使用Direct3D_進行討論,但是,Direct2D必須使用Direct3D_。構建Direct3D器件的成本非常低。至於你鏈接的文章,通過所有的傳福音你會發現以下內容:「BitBlt API是硬件加速的」。至於「game-ish」:我不會自動閱讀「具有所有的花裏胡哨和更多的藝術3D渲染狀態」。 – IInspectable