2014-05-15 74 views
1

我的問題是獲取窗口中的像素。我找不到辦法做到這一點。我使用標準的Windows功能和Direct2D(不是DirectDraw)。 我使用新窗口的標準初始化:如何使用Direct2D從窗口獲取像素

WNDCLASS wc; 
wc.style = CS_OWNDC; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance = hInstance; 
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(6); 
wc.lpszMenuName = 0; 
wc.lpszClassName = L"WINDOW"; RegisterClass(&wc); 
hWnd = CreateWindow(L"WINDOW", L"Game", WS_OVERLAPPEDWINDOW,100,100,1024,768,NULL,NULL,hInstance,NULL); 

然後,我創建一個D2D1factory對象,繪製位圖的窗口:

HWND hWnd = NULL; 
srand((unsigned int)time((time_t)NULL)); 

ID2D1Factory* factory = NULL; 
ID2D1HwndRenderTarget* rt = NULL; 
CoInitializeEx(NULL,COINIT_MULTITHREADED); 
My_CreateWindow(&hWnd, hInstance); 
My_CreateFactory(&hWnd, factory, rt); 
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&factory); 

factory->CreateHwndRenderTarget(RenderTargetProperties(), HwndRenderTargetProperties(hWnd,SizeU(800,600)), &rt); 

// tons of code 

rt->BeginDraw(); rt->DrawBitmap(background[0], RectF(0,0,800,600)); 
rt->DrawBitmap(GIFHorse[(int)iterator], 
RectF(0+MyX-100,0+MyY-100,100+MyX,100+MyY)); 
rt->DrawBitmap(Star[(int)iterator], RectF(0 + starX, 0 + starY, 50 + starX, 50+starY)); rt->EndDraw(); 

我需要計算命中(我試圖讓簡單的遊戲)。所以這就是爲什麼我需要訪問窗口中的所有像素。

我正在考慮使用其他算法,但它們很難做,我想從容易開始。

我知道GetPixel()函數,但我不知道我應該使用什麼HDC

回答

0

找到D2D像素沒有簡單而簡單的方法。

一個簡單的碰撞檢測可以使用幾何來實現。如果在ID2D1Geometry對象中有對象的輪廓,則可以使用ID2D1Geometry::CompareWithGeometry來比較它們。

如果你堅持的像素,對其進行訪問的方式是從獲得的DC通過IDXGISurface1::GetDC

在這種情況下,你需要使用DXGI表面呈現目標和交換鏈,而不是HWND的渲染目標。

循序漸進:

  1. D3D11CreateDeviceAndSwapChain給你的交換鏈。
  2. IDXGISwapChain::GetBuffer爲您提供了DXGI表面。
  3. ID2D1Factory::CreateDxgiSurfaceRenderTarget爲您提供渲染目標。
  4. IDXGISurface1::GetDC給你的DC。閱讀此頁面上的評論!
相關問題