Бывалый

Профиль
Группа: Участник
Сообщений: 174
Регистрация: 1.2.2009
Репутация: нет Всего: 1
|
У меня в программе поначалу инициализируется DirectDraw, потом Direct3D. Во время инициализации каждой части спрашивается: В полноэкранном режиме? Если два раза нажать нет: всё норм. Остальные варианты не работают, а при инициализации обоих частей в полноэкранном режиме: ошибка инициализации Direct3D. Насколько я знаю в Direct3D есть поддержка 2D графики, какую из книг по Direct3D вы можете порекомендовать мне, желательно с обсуждением этой темы. А пока, как запустить DirectDraw и Direct3D в полноэкранных режимах? Инициализация DirectDraw | Код | HRESULT DXDDInit(IDirectDraw7 **ppiDD, IDirectDrawSurface7 **primsurf, IDirectDrawSurface7 **backsurf, HWND hWnd, DWORD iWidth, DWORD iHeight, WORD iColors, BOOL *bFullScreen) { // Запрос на отображение в полноэкранном режиме int iRes; if ((*bFullScreen)==FALSE) iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION); else iRes = IDYES;
HRESULT hr; hr = DirectDrawCreateEx(NULL, (VOID**)ppiDD, IID_IDirectDraw7, NULL); if(FAILED(hr)) return 0;
if(iRes == IDYES) { ////////////////////////////////////////////////////////// // Полноэкранный режим ////////////////////////////////////////////////////////// *bFullScreen=TRUE;
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); (*ppiDD)->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); (*ppiDD)->SetDisplayMode(iWidth, iHeight, iColors, 0, 0); } else { ////////////////////////////////////////////////////////// // Оконный режим ////////////////////////////////////////////////////////// *bFullScreen=FALSE;
RECT wndRect; RECT clientRect; GetWindowRect(hWnd, &wndRect); GetClientRect(hWnd, &clientRect); int iWinWidth = iWidth + (wndRect.right-wndRect.left) - (clientRect.right-clientRect.left); int iWinHeight = iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top); MoveWindow(hWnd, wndRect.left, wndRect.top, iWinWidth, iWinHeight, TRUE);
(*ppiDD)->SetCooperativeLevel(hWnd, DDSCL_NORMAL); }
DDSURFACEDESC2 desc; ZeroMemory(&desc, sizeof(desc)); desc.dwSize = sizeof(desc);
if(iRes == IDYES) { desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; desc.dwBackBufferCount = 1; desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; } else { desc.dwFlags = DDSD_CAPS; desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; }
hr=(*ppiDD)->CreateSurface(&desc, primsurf, 0); if (hr!=DD_OK) return 0;
if(iRes == IDYES) { DDSCAPS2 surfcaps; ZeroMemory(&surfcaps, sizeof(surfcaps)); surfcaps.dwCaps = DDSCAPS_BACKBUFFER; hr=(*primsurf)->GetAttachedSurface(&surfcaps, backsurf); if (hr!=DD_OK) return 0; ClearSurface(*primsurf, 0); ClearSurface(*backsurf, 0); } else { ZeroMemory(&desc, sizeof(desc)); desc.dwSize = sizeof(desc); desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; desc.dwWidth = iWidth; desc.dwHeight = iHeight; desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; // Создание поверхности HRESULT r=(*ppiDD)->CreateSurface(&desc, backsurf, 0); if (r!=DD_OK) return 0; //Ошибка создания поверхности }
return S_OK; }
|
Инициализация Direct3D: | Код | HRESULT DX3DInit(IDirect3D9 **ppiD3D9, IDirect3DDevice9 **ppiD3DDevice9, HWND hWnd, DWORD iWidth, DWORD iHeight, BOOL bFullScreen) { // Инициализация if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) return E_FAIL;
// Заполняем основные параметры представления D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = iWidth; d3dpp.BackBufferHeight = iHeight;
// Запрос на отображение в полноэкранном режиме int iRes; if (!bFullScreen) iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION); else iRes = IDYES;
if(iRes == IDYES) { ////////////////////////////////////////////////////////// // Полноэкранный режим ////////////////////////////////////////////////////////// // Установка параметров полноэкранного режима d3dpp.BackBufferFormat = D3DFMT_R5G6B5; d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; d3dpp.Windowed = FALSE; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; } else { ////////////////////////////////////////////////////////// // Оконный режим ////////////////////////////////////////////////////////// RECT wndRect; RECT clientRect; GetWindowRect(hWnd, &wndRect); GetClientRect(hWnd, &clientRect);
iWidth = iWidth + (wndRect.right-wndRect.left) - (clientRect.right-clientRect.left); iHeight = iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top);
MoveWindow(hWnd, wndRect.left, wndRect.top, iWidth, iHeight, TRUE);
// Получить формат пикселя D3DDISPLAYMODE d3ddm; (*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
// Установка параметров d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.Windowed = TRUE; } DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;
// Создать 3D устройство HRESULT hRes; if(FAILED(hRes = (*ppiD3D9)->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, Flags, &d3dpp, ppiD3DDevice9))) return hRes;
// Установить перспективу float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight; D3DXMATRIX matProjection; D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 0.1f, 1000.0f); (*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);
(*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK; }
|
|