Книга: DirectX 8 Programming Tutorial
Creating Your First Project
Creating Your First Project
Okay, that’s enough theory lets get started. Follow the step-by-step guide below to create your first DirectX Graphics project.
1. In Visual C++ create a new Win32 Application.
a. File?New
b. From the Projects tab select Win32 Application
c. Enter a name for your project such as “DX Project 1”
d. Select a folder for the location of your source code files
e. Click Next
f. Select the empty project option.
g. Click Finish
2. Make sure that your project settings are correct.
a. Project?Settings…
b. On the Link tab, make sure that "d3d8.lib" is in the list of Object/Library Modules. If it isn Їt simply type it in.
3. Make sure that your search paths are correct.
a. Tools?Options?Directories Tab
b. In the "Show directories for" drop-down, select "include files".
c. If it does not exist already, add the following path: <SDK INSTALL PATH>include.
d. Make sure that this path is at the top of the list by clicking on the up arrow button (if needed).
e. In the "Show directories for" drop-down, select "library files".
f. If it does not exist already, add the following path: <SDK INSTALL PATH>lib.
g. Make sure that this path is at the top of the list by clicking on the up arrow button (if needed).
4. Add the source code.
a. File?New
b. From the Files tab, select C++ Source File
c. Enter a filename such as “Main.cpp”
d. Copy the code segment below, and then paste it into your new file.
5. Build and Run the program.
a. Press F7 to build your project
b. Press F5 to run
#include <d3d8.h>
LPDIRECT3D8 g_pD3D = NULL;
LPDIRECT3DDEVICE8 g_pD3DDevice = NULL;
HRESULT InitialiseD3D(HWND hWnd) {
//First of all, create the main D3D object. If it is created successfully we
//should get a pointer to an IDirect3D8 interface.
g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
if (g_pD3D == NULL) {
return E_FAIL;
}
//Get the current display mode
D3DDISPLAYMODE d3ddm;
if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) {
return E_FAIL;
}
//Create a structure to hold the settings for our device
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
//Fill the structure.
//We want our program to be windowed, and set the back buffer to a format
//that matches our current display mode
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
d3dpp.BackBufferFormat = d3ddm.Format;
//Create a Direct3D device.
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice))) {
return E_FAIL;
}
return S_OK;
}
void Render() {
if (g_pD3DDevice == NULL) {
return;
}
//Clear the backbuffer to a green color
g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
//Begin the scene
g_pD3DDevice->BeginScene();
//Rendering of our game objects will go here
//End the scene
g_pD3DDevice->EndScene();
//Filp the back and front buffers so that whatever has been rendered on the back buffer
//will now be visible on screen (front buffer).
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
void CleanUp() {
if (g_pD3DDevice != NULL) {
g_pD3DDevice->Release();
g_pD3DDevice = NULL;
}
if (g_pD3D != NULL) {
g_pD3D->Release();
g_pD3D = NULL;
}
}
void GameLoop() {
//Enter the game loop
MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while (msg.message != WM_QUIT) {
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if (fMessage) {
//Process message
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
//No message to process, so render the current scene
Render();
}
}
}
//The windows message handler
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
switch (wParam) {
case VK_ESCAPE:
//User has pressed the escape key, so quit
DestroyWindow(hWnd);
return 0;
break;
}
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
//Application entry point
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) {
//Register the window class
WNDCLASSEX wc = {
sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "DX Project 1", NULL
};
RegisterClassEx(&wc);
//Create the application's window
HWND hWnd = CreateWindow("DX Project 1", www.andypike.com: Tutorial 1, WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL);
//Initialize Direct3D
if (SUCCEEDED(InitialiseD3D(hWnd))) {
//Show our window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//Start game running: Enter the game loop
GameLoop();
}
CleanUp();
UnregisterClass("DX Project 1", wc.hInstance);
return 0;
}
You should finish up with a window with a green background (shown below). Okay, it Їs not much I know, but everyone has to start somewhere.
So, what is going on here?
WinMain
This is the applications entry point. Code execution will start here. This is where we register, create and show our window. Once that is complete, we initialise Direct3D and enter our game loop.
WinProc
This is the applications message handler. Whenever Windows sends a message to our application, it will be handled by this function. Notice that there are two messages that our application will handle: WM_DESTROY and WM_KEYUP, all other messages are passed to DefWindowProc for default message processing.
g_pD3D
This is a pointer to an IDirect3D8 interface. From this interface we will create our Direct3D Device.
g_pD3DDevice
This is a pointer to an IDirect3DDevice8 interface. This will actually represent your hardware graphics card.
InitialiseD3D
This does exactly that: initialise Direct3D. First of all, we create the IDirect3D8 object. From this object we can determine the users current display mode. Finally, we use this information to create a compatible device.
GameLoop
Once our window is created this function is called. This function contains the main game loop. If there are no windows messages to handle, it calls our Render() function.
Render
Firstly we clear the back buffer ready for drawing. Then we use the BeginScene method of our device object to tell DirectX that we are about to start drawing. We can then start to draw our game objects (Tutorial 2). Once we have finished drawing, we use the EndScene method of our device object to tell DirectX that we have finished drawing. The final step is to "flip" (present) the back buffer, this will display our game objects to the user.
CleanUp
Simply cleans up by releasing our objects.
- Creating a GUI with Gtk#
- 7.3 Our First Plug-In
- Ограничение результатов выборки FIRST
- Chapter 12. Debugging your scripts
- Project PDL
- Глава 5. Разработка и анализ бизнес-планов в системе Project Expert
- Turtle Firewall Project
- Listing your active rule-set
- Updating and flushing your tables
- How to use this License for your documents
- 2. How to Apply These Terms to Your New Programs
- Creating CDs from the Command Line