0% found this document useful (0 votes)
52 views33 pages

Init, Simple Drawing and Movement

The document provides instructions for setting up a basic DirectX 10 game project in Visual Studio 2019. It describes how to create an empty project, link the DirectX libraries, set up a window class and window, and initialize Direct3D 10. It also explains how to load a texture, create a sprite, implement a game loop to update and render the game world each frame, and limit the frame rate. Movement is implemented by updating the sprite's position each frame based on its velocity and the time elapsed.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
52 views33 pages

Init, Simple Drawing and Movement

The document provides instructions for setting up a basic DirectX 10 game project in Visual Studio 2019. It describes how to create an empty project, link the DirectX libraries, set up a window class and window, and initialize Direct3D 10. It also explains how to load a texture, create a sprite, implement a game loop to update and render the game world each frame, and limit the frame rate. Movement is implemented by updating the sprite's position each frame based on its velocity and the time elapsed.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 33

Init & simple drawing

Objectives
 Create a skeleton DirectX 10 project
 Understand game loop
 Render a sprite
 Create simple movement
Set up sample project on VS2019
 Create C++ | Windows | Desktop | Empty
project
 Link to D3D10 lib
 Install D3D10X lib using NuGet
 Hide unrelated debug messages
Create an empty project
Create an empty project
Platform x64 x86
Debug
Setting up project Release

Project > Properties > Linker > Input

Make sure you select the matching platform: x64 (64-bit) or x86 (32-bit)
Setting up project

Platform x64 x86


Debug
Release

x64 : 64-bit code, today’s standard


x86 : 32-bit code

Project > Properties > Linker > Input

Make sure you select the matching platform: x64 (64-bit) or x86 (32-bit)
Setting up project

Add d3d10.lib, dxguid.lib,dinput8.lib into list of linked libraries


Install D3D10x library

Install-Package Microsoft.DXSDK.D3DX
Turn off unwanted debug
messages
Tools > Options > Debugging > Output Window

Turn OFF everything under General Output Settings


except Exception Messages
DirectX components

 Direct3D
 DirectX Audio:
 DirectMusic
 DirectSound
 DirectSound3D
 DirectInput
 DirectPlay: obsoleted
A simple window application
A simple window application
 Create a window class
 Create a window
 Create message loop
Creating a window class
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);

wc.style = CS_HREDRAW | CS_VREDRAW;


wc.hInstance = hInstance;

wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = “GameWindow”;
wc.hIconSm = NULL;

RegisterClassEx(&wc);

Register a new Window Class


Creating a window
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);

wc.style = CS_HREDRAW | CS_VREDRAW;


wc.hInstance = hInstance;
Specify the function to handle
wc.lpfnWndProc = (WNDPROC)WinProc; the messages sent to windows
wc.cbClsExtra = 0; of this class – Window
wc.cbWndExtra = 0; Procedure (WinProc)
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = “GameWindow”;
wc.hIconSm = NULL;

RegisterClassEx(&wc);
Creating a window
Create a window from the
HWND hWnd =
registered class
CreateWindow(
“GameWindow”, // Window class name
“00 - Intro", // Title
WS_OVERLAPPEDWINDOW, // Window type
CW_USEDEFAULT, // Initial position
CW_USEDEFAULT,
800, // Width
600, // Height
NULL,
NULL,
hInstance, // Program instance
NULL);

if (!hWnd)...
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd); Display the window AND update
the window’s content.
Message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;

Sleep until a message is available from the message queue (GetMessage) and
send it to the appropriate window.

This message loop is NOT appropriate for real-time game, why?


A simple Direct3D 10 game
Simple Direct3D 10 game
 Initiate Direct3D 10
 Load a texture and create a sprite
 Game loop
 Render world
 Update world
 Limiting max frame rate
Init Direct3D 10
 Create device and swap chain
 D3D10CreateDeviceAndSwapChain
 Create & set render target view to the device
 CreateRenderTargetView
 OMSetRenderTargets
 RSSetViewports
 Create and initiate Sprite drawing support library
 D3DX10CreateSprite
 D3DXMatrixOrthoOffCenterLH
 SetProjectionTransform
Load a texture
 Load a resource from file
 D3DX10CreateTextureFromFile
 Retrieve texture interface (i.e convert to texture)
 QueryInterface
 Create shader resource view for the sprite
 CreateShaderResourceView
 Initiate a DirectX 10 sprite
Game loop
int done = 0;
while (!done) {
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if (msg.message==WM_QUIT) done=1;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
...
Update(dt);
Render();
...
}

PeekMessage: Check if there is a message, get it to msg and remove


that message from queue. If there is NO message, return false
Render world
 Render a frame
 Only READ world’s status (i.e. every object’s status in the world)
 Do NOT update world’s status
 Clear the back buffer (i.e. clear the window)
 ClearRenderTargetView
 Compose and set the world transform matrix
 Translation: based on sprite location
 Scale: based on sprite width and height
 Draw a sprite
 DrawSpritesImmediate
Back buffer & double buffering
Render

ClearRenderTargetView
Back Buffer Frame Buffer Screen/Display

Present

DrawSpritesImmediate

Texture

D3DX10CreateTextureFromFile
LoadResources
brick.png
Update world
 Update world status
 update status (position, speed, etc.) of each object
in the game world
 Must not contain any code related to rendering
 Must not read/write sprite, image, etc
Limiting max frame rate
#define MAX_FRAME_RATE 60

… 1 tick ~ 1millisecond
ULONGLONG frameStart = GetTickCount();
ULONGLONG tickPerFrame = 1000 / MAX_FRAME_RATE;

while (!done) {
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
// ...
}

ULONGLONG now = GetTickCount64();


DWORD dt = now – frameStart;
if ( dt >= tickPerFrame) {
frameStart = now;
Update(dt);
Render();
}
else
Sleep(tickPerFrame - dt);

}
Limiting max frame rate

now now

Frame 1 Frame 2

dt
sleep

actual (update + render) time

tickPerFrame tickPerFrame
Movement

while (!done) {
// ...

Update(dt);
// brick_x++;

Render();
}
Frame-rate dependent movement

while (!done) {
// ...

Update(dt);
// brick_x += brick_vx*dt;

Render();
}
Exercise
 Change the brick into a pool ball
 Make the ball move and deflect from both
dimensions just like a pool ball
 Make many balls moving
 Challenge: can you make the ball movement
more real?
 Hint: adding acceleration and friction
Sample 00
 DebugOut :
 output debug string to console
 DebugOutTitle
 output a string to the game’s window title
 _W(__FILE__) , __LINE__ macros
Window client area

_ X

CLIENT AREA
Window client area
brick_x

You might also like