Sprite's background

Started by
9 comments, last by speedie 16 years, 11 months ago
Hey everyone,Im new to game programming and i've been trying to create a 2d game. In my game there's a character but when I put it on the screen it comes with a background.. is there any way for me to create a sprite with no background? btw Im programming with c++(directx 9) thx
Advertisement
You can use transparency to not render the background.

As long as the background color is a single color, simply
render each pixel, and skip each pixel with the color of
the sprites background. Doing this, the background will not
be rendered.

Alot of APIs provide routined to do this. What API are you using?

*edit: I apologize, didnt realize you are using DX 9
Sure are.

We'll tell you more, if you tell us more. How you do this depends largely on what you're using to draw them.
here's my code:

// Include the Windows header file that’s needed for all Windows applications#include <windows.h>#include <d3d9.h>#include <d3dx9.h>#include <iostream>using namespace std;#define letterW 65#define letterH 61typedef struct sprite_struct{	//size	RECT size;	//location	long x;	long y;	//movement	float moveX;	float moveY;	//animations	int numframes;	int curframe;} sprite;HINSTANCE hInst; // global handle to hold the application instanceHWND wndHandle; // global variable to hold the window handle// forward declarationsLPDIRECT3D9 pD3D; // the Direct3D objectLPDIRECT3DDEVICE9 pd3dDevice; // the Direct3D deviceIDirect3DSurface9* surface; //personal surface pointerIDirect3DSurface9* character_sur;LARGE_INTEGER timeStart; // holds the starting countLARGE_INTEGER timeEnd; // holds the ending countLARGE_INTEGER timerFreq; // holds the frequency of the counterfloat anim_rate;RECT src,des;RECT src2,des2;sprite character;//-------------------------------------------------bool initWindow( HINSTANCE hInstance );LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );bool initDirect3D(void);void render(void);void cleanUp (void);IDirect3DSurface9* getSurfaceFromBitmap(std::string filename);void init_background();void init_character();//-------------------------------------------------// This is winmain, the main entry point for Windows applicationsint WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow ){	// Initialize the windowif ( !initWindow( hInstance ) )return false;if ( !initDirect3D( ) )return false;surface=getSurfaceFromBitmap("test.bmp");character_sur=getSurfaceFromBitmap("char5.bmp");if ((surface==NULL)||(character_sur==NULL))return false;//init_background();init_character();    QueryPerformanceFrequency(&timerFreq);// main message loop:MSG msg;ZeroMemory( &msg, sizeof( msg ) );while( msg.message!=WM_QUIT ){	if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )	{		TranslateMessage ( &msg );		DispatchMessage ( &msg );	}	else	{						QueryPerformanceCounter(&timeStart);				render( );		QueryPerformanceCounter(&timeEnd);		anim_rate =((float)timeEnd.QuadPart - (float)timeStart.QuadPart ) /timerFreq.QuadPart;			}} cleanUp ();return (int) msg.wParam;	}/******************************************************************************* bool initWindow( HINSTANCE hInstance )* initWindow registers the window class for the application, creates the window******************************************************************************/bool initWindow( HINSTANCE hInstance ){	WNDCLASSEX wcex;	// Fill in the WNDCLASSEX structure. This describes how the window	// will look to the system	wcex.cbSize = sizeof(WNDCLASSEX); // the size of the structure	wcex.style = CS_HREDRAW | CS_VREDRAW; // the class style	wcex.lpfnWndProc = (WNDPROC)WndProc; // the window procedure callback	wcex.cbClsExtra = 0; // extra bytes to allocate for this class	wcex.cbWndExtra = 0; // extra bytes to allocate for this instance	wcex.hInstance = hInstance; // handle to the application instance	wcex.hIcon = 0; // icon to associate with the application	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);// the default cursor	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // the background color	wcex.lpszMenuName  = NULL; // the resource name for the menu	wcex.lpszClassName = "DirectXExample"; // the class name being created	wcex.hIconSm = 0; // the handle to the small icon	RegisterClassEx(&wcex);	// Create the window	wndHandle = CreateWindow(	"DirectXExample",	"DirectXExample",	WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE,	// the window class to use	// the title bar text	// the window style	CW_USEDEFAULT, // the starting x coordinate    CW_USEDEFAULT, // the starting y coordinate	640, // the pixel width of the window	480, // the pixel height of the window	NULL, // the parent window; NULL for desktop	NULL, // the menu for the application; NULL for	// none	hInstance, // the handle to the application instance	NULL); // no values passed to the window	// Make sure that the window handle that is created is valid		if (!wndHandle)	return false;	// Display the window on the screen	ShowWindow(wndHandle, SW_SHOW);	UpdateWindow(wndHandle);	return true;}/******************************************************************************* LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,* LPARAM lParam)* The window procedure******************************************************************************/LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){	// Check any available messages from the queue	switch (message)	{		case WM_DESTROY:		{	    MessageBox(NULL,"Window has ended","End",MB_OK);		PostQuitMessage(0);		}		break;		case WM_KEYDOWN:		{			switch( wParam )            {                case VK_ESCAPE:                PostQuitMessage(0);                break;            }	     			}		break;		}		return DefWindowProc(hWnd, message, wParam, lParam);}/********************************************************************** initDirect3D*********************************************************************/bool initDirect3D(void){	pD3D = NULL;	pd3dDevice = NULL;	if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )	{	return false;	}	D3DPRESENT_PARAMETERS d3dpp;	ZeroMemory( &d3dpp, sizeof( d3dpp ) );	d3dpp.Windowed = FALSE;	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;	d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;	d3dpp.BackBufferCount = 1;	d3dpp.BackBufferHeight = 480;	d3dpp.BackBufferWidth = 640;	d3dpp.hDeviceWindow = wndHandle;	if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,wndHandle,		                            D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pd3dDevice ) ) )	{	return false;	}	return true;}void render(void){		static counter=0;    IDirect3DSurface9* backbuffer = NULL;	if( NULL == pd3dDevice )	return;				pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,	D3DCOLOR_XRGB( 0,50,100 ), 1.0f, 0 );    pd3dDevice->GetBackBuffer( 0,0,D3DBACKBUFFER_TYPE_MONO,&backbuffer );    pd3dDevice->StretchRect(character_sur,&src2,backbuffer,&des2,D3DTEXF_NONE);   // pd3dDevice->StretchRect(surface,&src,backbuffer,&des,D3DTEXF_NONE);//background niceling       				// Present the back buffer contents to the display	pd3dDevice->Present( NULL, NULL, NULL, NULL );				}void cleanUp (void){// Release the device and the Direct3D objectif( pd3dDevice != NULL )pd3dDevice->Release( );if( pD3D != NULL )pD3D->Release( );}/*********************************************************** getSurfaceFromBitmap**********************************************************/IDirect3DSurface9* getSurfaceFromBitmap(std::string filename){	HRESULT hResult;	IDirect3DSurface9* surface = NULL;	D3DXIMAGE_INFO imageInfo; // holds details concerning this bitmap	// Get the width and height info from this bitmap	hResult = D3DXGetImageInfoFromFile(filename.c_str(), &imageInfo);	// Make sure that the call to D3DXGetImageInfoFromFile succeeded	if FAILED (hResult)	return NULL;	// Create the offscreen surface that will hold the bitmap	hResult = pd3dDevice->CreateOffscreenPlainSurface( 640,	480,	D3DFMT_X8R8G8B8,	D3DPOOL_DEFAULT,	&surface,	NULL );	// Make sure that this function call did not fail; if it did,	// exit this function	if ( FAILED( hResult ) )	return NULL;	// Load the bitmap into the surface that was created earlier	hResult = D3DXLoadSurfaceFromFile( surface,	NULL,	NULL,	filename.c_str( ),	NULL,	D3DX_DEFAULT,	0,	NULL );	if ( FAILED( hResult ) )	return NULL;	return surface;}void init_background(){	src.top=50;	src.left=140;	src.bottom=250;	src.right=520;	des.top=50;	des.left=140;	des.bottom=250;	des.right=520;}void init_character(){	//size	src2.top=87;	src2.left=9;	src2.bottom=165;	src2.right=39;    	//location	character.x=0;	character.y=0;	//dest	des2.top=character.y;	des2.left=character.x;	des2.bottom=character.y+(src2.bottom-src2.top)-0;	des2.right=character.x+(src2.right-src2.left)-0;		}


The character's background is black :)
Quote:Original post by Crypter
You can use transparency to not render the background.

As long as the background color is a single color, simply
render each pixel, and skip each pixel with the color of
the sprites background. Doing this, the background will not
be rendered.

Alot of APIs provide routined to do this. What API are you using?


can you tell me how do I tell my device not to render black pixels please? and isn't this problematic if what Im trying to render consists of black pixels?

Quote:
can you tell me how do I tell my device not to render black pixels please? and isn't this problematic if what Im trying to render consists of black pixels?

Pick a color that you will never use as the background color.

I can show you how to do it in DirectDraw, but I dont know Direct3D.
If I find any resources/tutorial for Direct3D, Ill post it[smile]
Transparency with Direct3d color keys
Tutorial source (as *.zip)

Hope this helps!
what art program are you using, lots of them support alpha channels letting you to leave the background blank (i.e. no color), then you'd just have to save the image as a PNG or a TARGA format.
-----------------------------------------------The ZoloProject
Quote:Original post by speedie
what art program are you using, lots of them support alpha channels letting you to leave the background blank (i.e. no color), then you'd just have to save the image as a PNG or a TARGA format.



Adobe photoshop and photoimpact
but I couldn't manage to make a picture without a background.. it always leaves me with a white background .


**I understand I need to save my sprite somehow as .png file which supports alpha channels and then tell me device not to render it somehow.. can anyone tell me how? I searched google and I only found methods which use vertex buffers but I think there's another way.

[Edited by - corntown on May 6, 2007 3:37:07 AM]
Keep in mind that .png alpha channels are broken on many versions of Photoshop. I don't know if they've fixed it yet on the newest versions.
NextWar: The Quest for Earth available now for Windows Phone 7.

This topic is closed to new replies.

Advertisement