sourceRect and destRect

I am supposed to draw a portion of a bitmap using sourceRect and destR

Page 1 of 1

0 Replies - 794 Views - Last Post: 02 November 2008 - 09:45 PM Rate Topic: -----

#1 Mowkage  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 4
  • Joined: 02-November 08

sourceRect and destRect

Post icon  Posted 02 November 2008 - 09:45 PM

I cannot figure out how to display a portion of the bitmap using sourceRect and destRect. We are supposed to be able to move the cut out bitmap around the screen with key presses. I know I can use an if statement for that, but I just can't figure out how to initialize sourceRect and destRect. Once I get help on that I should be able to figure out how to get it to move. Also, where are you supposed to initialize it? So far I have the portion of the image being displayed, but it's blown up in size. Here is my code so far:

#include <d3d9.h>
#include <d3dx9.h>
#include <time.h>

//application title
#define APPTITLE "Load_Bitmap"

//macros to read the keyboard asynchronously
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

//screen resolution
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

//forward declarations
LRESULT WINAPI WinProc(HWND, UINT, WPARAM, LPARAM);
ATOM MyRegisterClass(HINSTANCE);
int Game_Init(HWND);
void Game_Run(HWND);
void Game_End(HWND);

//Direct3D objects
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;

LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;

//window even callback function
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Game_End(hWnd);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}

//helper function to set up the window properties
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//create the window class structure
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);

//fill the struct with info
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = APPTITLE;
wc.hIconSm = NULL;

//set up the window with the class info
return RegisterClassEx(&wc);
}

//entry point for a Windows Program
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//declare variables
MSG msg;

//register the class
MyRegisterClass(hInstance);

//initialize application
HWND hWnd;

//create a new window
hWnd = CreateWindow(
APPTITLE, //window class
APPTITLE, //title bar
WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP, //window style
CW_USEDEFAULT, //x position of window
CW_USEDEFAULT, //y position of window
SCREEN_WIDTH, //width of the window
SCREEN_HEIGHT, //height of the window
NULL, //parent window
NULL, //menu
hInstance, //application instance
NULL); //window parameters

//was there an error creating the window?
if(!hWnd)
return FALSE;

//display the window
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

//initialize the game
if(!Game_Init(hWnd))
return 0;

//main message loop
int done = 0;
while (!done)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
//look for quit message
if(msg.message == WM_QUIT)
done = 1;

//decode and pass messages on to WndProc
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
//processes game loop (else prevents running after window is closed)
Game_Run(hWnd);
}

return msg.wParam;
}

int Game_Init(HWND hwnd)
{
HRESULT result;
//intitialize Direct3D
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL)
{
MessageBox(hwnd, "Error initializing Direct3D", "Error", MB_OK);
return 0;
}

//set Direct3D presentation parameters
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));

d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
d3dpp.hDeviceWindow = hwnd;

//create Direct3D device
d3d ->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

if (d3ddev == NULL)
{
MessageBox(hwnd, "Error creating Direct3D device", "Error", MB_OK);
return 0;
}

//set random number seed
//srand(time(NULL));

//clear the backbuffer to black
//d3ddev ->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

//create pointer to the back buffer
d3ddev ->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);

//create surface
result = d3ddev ->CreateOffscreenPlainSurface(
640, //width of the surface
480, //height of the surface
D3DFMT_X8R8G8B8, //surface format
D3DPOOL_DEFAULT, //memory pool to use
&surface, //pointer to the surface
NULL); //reserved (always NULL)

if(result != D3D_OK)
return 1;

HRESULT StretchRect(
IDirect3DSurface9 *pSourceSurface,
CONST RECT *pSourceRect,
IDirect3DSurface9 *pDestSurface,
CONST RECT *pDestRect,
D3DTEXTUREFILTERTYPE Filter
);


//load surface from file
result = D3DXLoadSurfaceFromFile(
surface, //destination surface
NULL, //destination palette
NULL, //destination rectangle
"spheres.bmp", //source filename
NULL, //source rectangle
D3DX_DEFAULT, //controls how image is filtered
0, //for transparency (0 for none)
NULL); //source image info (usually NULL)

//make sure file was loaded okay
if(result != D3D_OK)
return 1;


//draw surface to the back buffer ???
d3ddev ->StretchRect(surface, NULL, backbuffer, NULL, D3DTEXF_NONE);

//return okay
return 1;
}

void Game_Run(HWND hwnd)
{
RECT rect;
//make sure the Direct3D device is valid

if(d3ddev == NULL)
return;
//clear the backbuffer to black
d3ddev ->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

//start rendering
if (d3ddev ->BeginScene())
{
//copy the surface to the back buffer
rect.left = 164;
rect.top = 0;
rect.right = 323;
rect.bottom = 463;



//draw surface to the back buffer
d3ddev ->StretchRect(surface, &rect, backbuffer, &rect, D3DTEXF_NONE);

//create pointer to the back buffer
d3ddev ->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);


//stop rendering
d3ddev ->EndScene();
}

//display the back buffer on the screen
d3ddev ->Present(NULL, NULL, NULL, NULL);

if (KEY_DOWN(VK_UP))
{

}

if (KEY_DOWN(VK_DOWN))
{
}

if (KEY_DOWN(VK_LEFT))
{
}

if (KEY_DOWN(VK_RIGHT))
{
}


//check for escape key (to exit program)
if (KEY_DOWN(VK_ESCAPE))
PostMessage(hwnd, WM_DESTROY, 0, 0);
}

void Game_End(HWND hwnd)
{
//free the surface
surface ->Release();

//release the Direct3D device
if(d3ddev != NULL)
d3ddev ->Release();

//release the Direct3D object
if (d3d != NULL)
d3d ->Release();
}

Attached File(s)



Is This A Good Question/Topic? 0
  • +

Page 1 of 1