поэтому я делаю что-то, что рисует прямоугольник в зависимости от местоположения, которое они предоставляютТаким образом, если они дают определенный шнур экрана (например, 50, 100), он рисует прямоугольник там. Тем не менее, я сталкиваюсь с небольшой проблемой. Прямоугольник отображается в правильном месте, но с небольшими отверстиями. Я пошел вперед и нарисовал кучу прямоугольников, чтобы показать вам, ребята, о чем я. Кто-нибудь знает, почему это происходит?
#include <DirectXDraw.h>
#pragma warning(disable:4244)
LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 v_buffer;
D3DVIEWPORT9 d3dvp9;
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
struct CUSTOMVERTEX
{
float x, y, z, rhw;
uintptr_t color;
};
void InitD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
if (hWnd == NULL)
{
std::cout << "hWnd is NULL";
}
}
void GetResolution(int &width, int &height)
{
d3ddev->GetViewport(&d3dvp9);
width = d3dvp9.Width;
height = d3dvp9.Height;
}
void Draw(int x, int y, int width, int height, bool draw)
{
CUSTOMVERTEX OurVertices[] =
{
{x, y, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)}, // top left
{x, y + height, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)}, // bottom left
{x + width, y + height, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)}, // bottom right
{x + width, y, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)}, // top right
{x, y, 1.0f, 1.0f, D3DCOLOR_XRGB(500, 0, 0)},
{x, y, 1.0f, 1.0f, D3DCOLOR_ARGB(0, 0, 0, 0)},
};
d3ddev->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &v_buffer, NULL);
void* pVoid;
v_buffer->Lock(0, 0, &pVoid, NULL);
memcpy(pVoid, OurVertices, sizeof(OurVertices));
v_buffer->Unlock();
Render_Frame(draw);
}
void Render_Frame(bool draw)
{
if (draw == true)
{
d3ddev->Present(NULL, NULL, NULL, NULL);
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, NULL, 1.0f, 0);
}
else
{
d3ddev->BeginScene();
d3ddev->SetFVF(CUSTOMFVF);
// Rectangle
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
d3ddev->DrawPrimitive(D3DPT_LINESTRIP, 0, 6);
// Vertex
d3ddev->DrawPrimitive(D3DPT_POINTLIST, 0, 1);
d3ddev->EndScene();
}
}
void CleanD3D()
{
v_buffer->Release();
d3d->Release();
d3ddev->Release();
}