我的问题是获取窗口中的像素。我找不到办法做到这一点。我使用标准的Windows功能和Direct2D(不是DirectDraw)。 我正在使用新窗口的标准初始化:
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 :(得分:0)
没有简单易用的方法来获取D2D像素。
可以使用几何实现简单的碰撞检测。如果您在ID2D1Geometry
个对象中包含对象的大纲,则可以使用ID2D1Geometry::CompareWithGeometry
对其进行比较。
如果你坚持使用像素,那么访问它们的方法来自DC
可通过IDXGISurface1::GetDC
获取
在这种情况下,您需要使用DXGI曲面渲染目标和交换链而不是hwnd渲染目标。
一步一步:
D3D11CreateDeviceAndSwapChain
为您提供交换链。IDXGISwapChain::GetBuffer
为您提供DXGI表面。ID2D1Factory::CreateDxgiSurfaceRenderTarget
为您提供渲染目标。IDXGISurface1::GetDC
为您提供DC。阅读此页面上的评论!