www.pudn.com > CDX.rar > Ex5.cpp


// ------------------------------------------------------------------------------------------ 
// CDX example 5 - Sprite lists, resources and timing 
// You must link to cdd.lib, cdi.lib, ddraw.lib, dinput, dxguid and winmm.lib 
// ------------------------------------------------------------------------------------------ 
 
#include  
#include  
#include  
#include  
 
#define CDXINCLUDEALL           // include all CDX headers 
#include  
 
#define NAME		"CDXExample5" 
#define TITLE		"CDX Example 5" 
 
// The sprite types 
enum 
{ 
	SPR_BUG, 
	SPR_MOUTH, 
	SPR_CHOMPER, 
	SPR_PLAYER, 
}; 
 
 
CDXScreen   * Screen    = 0;    // The screen object, every program must have one 
CDXInput    * Input     = 0;    // The input object 
 
// The sprite bitmaps 
CDXTile     * Bug       = 0; 
CDXTile     * Mouth     = 0; 
CDXTile     * Chomper   = 0; 
CDXTile     * Player    = 0; 
 
BOOL        bActive     = TRUE; // Is the program running? 
 
// Frame rate counters 
DWORD           LastTime        = 0; 
DWORD           CurTime         = 0; 
DWORD           FpsTime         = 0; 
DWORD           DeltaTime       = 0; 
DWORD           FramesRendered  = 0; 
DWORD           Fps             = 0; 
 
CDXSpriteList   Sprites;        // The sprite list object 
 
// Resource bitmap files 
char BUG[]      = "BUG.BMP"; 
char MOUTH[]    = "MOUTH.BMP"; 
char CHOMPER[]  = "CHOMPER.BMP"; 
char PLAYER[]   = "PLAYER.BMP"; 
 
 
 
// ------------------------------------------------------------------------------------------ 
// FiniApp - Destroy the CDX objects 
// ------------------------------------------------------------------------------------------ 
void FiniApp(void) 
{ 
	SAFEDELETE( Bug ); 
    SAFEDELETE( Mouth ); 
    SAFEDELETE( Chomper ); 
    SAFEDELETE( Player ); 
    SAFEDELETE( Input ); 
	SAFEDELETE( Screen ); 
} 
 
 
 
// ------------------------------------------------------------------------------------------ 
// UpdateSprites, updates the sprites position  
// ------------------------------------------------------------------------------------------ 
void UpdateSprites(void) 
{ 
	CDXSprite* Node; 
 
	// Loop the list and update the sprites 
	for(Node = Sprites.GetFirst(); Node != NULL; Node = Sprites.GetNext(Node)) 
	{ 
		Node->SetPosX(Node->GetPosX() + Node->GetVelX()); 
		Node->SetPosY(Node->GetPosY() + Node->GetVelY()); 
 
		if(Node->GetPosX() < 0) 
		{ 
			Node->SetVelX(Node->GetVelX() - (2 * Node->GetVelX())); 
            Node->SetPosX(1); 
		} 
		if(Node->GetPosX() > (640 - Node->GetTile()->GetBlockWidth())) 
		{ 
			Node->SetVelX(Node->GetVelX() - (2 * Node->GetVelX())); 
			Node->SetPosX(639 - Node->GetTile()->GetBlockWidth()); 
		} 
		if(Node->GetPosY() < 0) 
		{ 
			Node->SetVelY(Node->GetVelY() - (2 * Node->GetVelY())); 
			Node->SetPosY(1); 
		} 
		if(Node->GetPosY() > (480 - Node->GetTile()->GetBlockHeight())) 
		{ 
			Node->SetVelY(Node->GetVelY() - (2 * Node->GetVelY())); 
			Node->SetPosY(479 - Node->GetTile()->GetBlockHeight()); 
		} 
	} 
} 
 
 
 
// ------------------------------------------------------------------------------------------ 
// DoUpdate, checks for keyboard input and updates the sprites 
// ------------------------------------------------------------------------------------------ 
void DoUpdate(void) 
{ 
	// Update the input device states 
	Input->Update(); 
 
    // if INSERT key was pressed, add a random sprite to the list 
	if( Input->GetKeyState(CDXKEY_INS) ) 
	{ 
		int Type = rand()%3; 
		int PosX = rand()%556; 
		int PosY = rand()%400; 
		int VelX = rand()%3; 
		int VelY = rand()%3; 
 
		switch(Type) 
		{ 
			case SPR_BUG: 
				{ 
					CDXSprite *s; 
					s = new CDXSprite(); 
					s->Create(Bug); 
					s->SetPosX(PosX); 
					s->SetPosY(PosY); 
					s->SetVelX(VelX); 
					s->SetVelY(VelY); 
					Sprites.AddSprite(s); 
					//Bug,Type,PosX,PosY,VelX,VelY,0,0,0); 
				} 
			case SPR_MOUTH: //Sprites.AddSprite(Mouth,Type,PosX,PosY,-VelX,VelY,0,0,0); 
				{ 
					CDXSprite *s; 
					s = new CDXSprite(); 
					s->Create(Mouth); 
					s->SetPosX(PosX); 
					s->SetPosY(PosY); 
					s->SetVelX(-VelX); 
					s->SetVelY(VelY); 
					Sprites.AddSprite(s); 
				} 
			case SPR_CHOMPER: //Sprites.AddSprite(Chomper,Type,PosX,PosY,VelX,-VelY,0,0,0); 
				{ 
					CDXSprite *s; 
					s = new CDXSprite(); 
					s->Create(Chomper); 
					s->SetPosX(PosX); 
					s->SetPosY(PosY); 
					s->SetVelX(VelX); 
					s->SetVelY(-VelY); 
					Sprites.AddSprite(s); 
				} 
			case SPR_PLAYER: //Sprites.AddSprite(Player,Type,PosX,PosY,-VelX,-VelY,0,0,0); 
				{ 
					CDXSprite *s; 
					s = new CDXSprite(); 
					s->Create(Player); 
					s->SetPosX(PosX); 
					s->SetPosY(PosY); 
					s->SetVelX(-VelX); 
					s->SetVelY(-VelY); 
					Sprites.AddSprite(s); 
				} 
		} 
	} 
 
    // if DEL key was pressed, delete a sprite from the list 
	if( Input->GetKeyState(CDXKEY_DEL) )  
		Sprites.DelSprite(Sprites.GetFirst()); 
 
	// Loop the sprite list and update the sprites 
	UpdateSprites(); 
 
	// Clear the back buffer 
	Screen->Fill(0); 
 
	// Draw all the sprites in the list 
	Sprites.Draw(Screen->GetBack() , 0 , 0 , CDXBLT_TRANS ); 
 
	// Frame rate calculations 
	CurTime   = timeGetTime(); 
	DeltaTime = CurTime - LastTime; 
	LastTime  = CurTime; 
	FpsTime  += DeltaTime; 
 
	FramesRendered++; 
 
	if (FpsTime > 1000) 
	{ 
		Fps = FramesRendered; 
		FramesRendered  = 0; 
		FpsTime = 0; 
	} 
 
	char str[12]; 
	sprintf(str, "FPS: %d", Fps); 
 
	// Print the frame rate to the screen 
	Screen->GetBack()->GetDC(); 
	Screen->GetBack()->SetFont(); 
	Screen->GetBack()->TextXY(5, 5, 255, str); 
	Screen->GetBack()->TextXY(5, 20, 255, "INSERT - ADD SPRITE"); 
	Screen->GetBack()->TextXY(5, 35, 255, "DELETE - DEL SPRITE"); 
 
	sprintf(str, "COUNT: %d", Sprites.GetCount()); 
	Screen->GetBack()->TextXY(5, 50, 255, str); 
 
	Screen->GetBack()->ReleaseDC(); 
 
	// Display the back buffer 
	Screen->Flip(); 
} 
 
 
 
// ------------------------------------------------------------------------------------------ 
// WinProc, this handles all windows messages 
// ------------------------------------------------------------------------------------------ 
long PASCAL WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	switch(message) 
	{ 
		case WM_ACTIVATEAPP:    bActive = wParam;   // set if app is active or not 
			                    break; 
 
		case WM_KEYDOWN:		switch(wParam)      // if ESC key is hit, quit program 
			                    { 
				                    case VK_ESCAPE: 
					                PostMessage(hWnd, WM_CLOSE, 0, 0); 
				                    break; 
			                    } 
		                        break; 
 
		case WM_DESTROY:		FiniApp();			// destroy all objects 
								PostQuitMessage(0); // terminate program 
		                        break; 
	} 
 
	return DefWindowProc(hWnd, message, wParam, lParam); 
} 
 
 
 
 
///////////////////////////////////////////////////////////////////////////////////////////// 
// InitApp - Create the window and the CDX objects 
///////////////////////////////////////////////////////////////////////////////////////////// 
BOOL InitApp(HINSTANCE hInst, int nCmdShow) 
{ 
	HWND hWnd; 
	WNDCLASS WndClass; 
 
	WndClass.style = CS_HREDRAW | CS_VREDRAW; 
	WndClass.lpfnWndProc = WinProc; 
	WndClass.cbClsExtra = 0; 
	WndClass.cbWndExtra = 0; 
	WndClass.hInstance = hInst; 
	WndClass.hIcon = LoadIcon(0, IDI_APPLICATION); 
	WndClass.hCursor = LoadCursor(0, IDC_ARROW); 
	WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 
	WndClass.lpszMenuName = 0; 
	WndClass.lpszClassName = NAME; 
	RegisterClass(&WndClass); 
 
    // create the main window 
	hWnd = CreateWindowEx( 
		WS_EX_TOPMOST, 
		NAME, 
		TITLE, 
		WS_POPUP, 
		0,0, 
		GetSystemMetrics(SM_CXSCREEN), 
		GetSystemMetrics(SM_CYSCREEN), 
		NULL, 
		NULL, 
		hInst, 
		NULL); 
 
    // when hWnd = -1 there was an error creating the main window 
    // CDXError needs a CDXScreen object, if there is none at this early 
    // program stage, pass it NULL 
	if(!hWnd)  
        CDXError( NULL , "could not create the main window" ); 
 
    // show the main window 
	ShowWindow(hWnd, nCmdShow); 
	UpdateWindow(hWnd); 
 
	// Create the CDXSreen object 
	Screen = new CDXScreen(); 
 
    // set video mode 640x480x8 
    if( FAILED(Screen->CreateFullScreen( hWnd , 640 , 480 , 8 ) ) ) 
        CDXError( Screen , "could not set video mode 640x480x8" ); 
 
    // load and set the palette for this videomode from the BUG bitmap file 
    if( FAILED(Screen->LoadPalette(BUG) ) ) 
        CDXError( Screen , "Could not load palette from file BUG.BMP" ); 
 
   	// Create the input device 
	Input = new CDXInput; 
    if( Input == NULL ) 
        CDXError( Screen , "Could not create CDXInput object!" ); 
 
	if( FAILED(Input->Create(hInst, hWnd) ) ) 
        CDXError( Screen , "Could not create CDXInput object!" ); 
 
	// Load the bitmaps 
    Bug = new CDXTile(); 
    if( Bug->Create( Screen , BUG , 84 , 80 , 0 ) == FALSE ) 
        CDXError( Screen , "could not load tiles from file BUG.BMP" ); 
 
    Mouth = new CDXTile(); 
    if( Mouth->Create( Screen , MOUTH , 39 , 36 , 0 ) == FALSE ) 
        CDXError( Screen , "could not load tiles from file MOUTH.BMP" ); 
 
    Chomper = new CDXTile(); 
    if( Chomper->Create( Screen , CHOMPER , 38 , 34 , 0 ) == FALSE ) 
        CDXError( Screen , "could not load tiles from file CHOMPER.BMP" ); 
 
    Player = new CDXTile(); 
    if( Player->Create( Screen , PLAYER , 38 , 36 , 0 ) == FALSE ) 
        CDXError( Screen , "could not load tiles from file PLAYER.BMP" ); 
 
	// Set the bitmaps transparent color 
	Bug->SetColorKey(8); 
	Mouth->SetColorKey(8); 
	Chomper->SetColorKey(8); 
	Player->SetColorKey(8); 
	 
	// Seed the random-number generator with current time 
	srand((unsigned)time(NULL)); 
 
	// Change the default font 
	Screen->GetBack()->ChangeFont("Comic Sans MS", 0, 18); 
 
	return TRUE; 
} 
 
 
 
// ------------------------------------------------------------------------------------------ 
// WinMain 
// ------------------------------------------------------------------------------------------ 
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) 
{ 
	MSG     msg; 
 
	if(!InitApp(hInst, nCmdShow)) 
        CDXError( NULL , "could not initialize CDX application" ); 
 
	while(1) 
	{ 
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
		{ 
			if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam; 
			TranslateMessage(&msg);  
			DispatchMessage(&msg); 
		} 
		else if(bActive)                            // if application has the focus, process 
		{ 
			DoUpdate(); 
		} 
		else WaitMessage(); 
	} 
}