Котята, начнём потихоньку, DirectX всё-таки!
Вот что нам понадобится:
-Microsoft Visual C++ 2010 Express - [тык].
-DirectX SDK - [тык] (на момент написания сего набора букв - версия от июня 2010).
-Чай\Кофе\Бутерброды.
Итак! Берём и безжалостно устанавливаем вижуал студию. Как только установили - точно так же устанавливаем SDK (Software Development Kit - Набор Инструментов Разработки).
Если при попытке установить последний получаем ошибку S1023 - делаем следующее:
1. Win+R - cmd - Enter.
2. MsiExec.exe /passive /X{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5} - Enter.
Вот что нам понадобится:
-Microsoft Visual C++ 2010 Express - [тык].
-DirectX SDK - [тык] (на момент написания сего набора букв - версия от июня 2010).
-Чай\Кофе\Бутерброды.
Итак! Берём и безжалостно устанавливаем вижуал студию. Как только установили - точно так же устанавливаем SDK (Software Development Kit - Набор Инструментов Разработки).
Если при попытке установить последний получаем ошибку S1023 - делаем следующее:
1. Win+R - cmd - Enter.
2. MsiExec.exe /passive /X{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5} - Enter.
3. MsiExec.exe /passive /X{1D8E6291-B0D5-35EC-8441-6616F567A0F7} - Enter.
4. Пробуем ещё раз установить sdk. Должно получиться.
5. Как установили - идём [сюда] и устанавливаем x86 (а если у вас 64-битная винда - то и x86 и x64).
После этого делаем финт ушами - запускаем студию, создаём новый проект, вводим ему имя, говорим, что это будет Win32 Project, жмём OK и дальше везде Next, ничего не трогая. Получаем вот такую тему (которая уже даже запускается):
Что эта чёрная магия умеет делать? По сути - корректно запускаться и корректно закрываться - можно поелозить её по экрану, порастягивать и даже потыкать по менюшкам. Но это - нифига не DirectX! Как так? Вдыхаем поглубже и копируем вместо старого вот этот код:
#include
#include
#include
#include
#pragma comment (lib, "d3d9.lib")
LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
void initD3D(HWND hWnd);
void render_frame(void);
void cleanD3D(void);
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass";
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL, L"WindowClass", L"Test Direct3D Program", WS_OVERLAPPEDWINDOW, 300, 300, 800, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
initD3D(hWnd);
MSG msg;
while(TRUE) {
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT) break;
render_frame();
}
cleanD3D();
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_DESTROY: {
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
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);
}
void render_frame(void) {
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
d3ddev->BeginScene();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
void cleanD3D(void) {
d3ddev->Release();
d3d->Release();
}
Ничего не понимаем, пробуем запустить. Если до этого всё установили, получаем нечто такое:
Крутая штука заключается в том, что окно теперь синенькое, но не просто синенькое - синеньким его делает уже DirectX!
На созерцании подобного чуда пока остановимся, в следующей статье подробно разберём весь код. Кстати, весь проект целиком можно скачать у меня на сайте - [keng.gamehacklab.ru], раздел Releases.