www.pudn.com > DirectX的游戏代码.rar > Game.cpp


// Game.cpp: implementation of the CGame class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include  
#include "Game.h" 
 
extern HWND		g_h_wnd; 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CGame::CGame() 
{ 
	m_game_state=GAME_STATE_INIT; 
} 
 
CGame::~CGame() 
{ 
 
} 
 
//游戏主循环函数 
int CGame::Game_Main() 
{ 
	switch(m_game_state) 
	{ 
	case GAME_STATE_INIT:			//初始化 
		{ 
			Game_Init(); 
		} 
		break; 
	case GAME_STATE_UPDATE_LEVEL:	//升级 
		{ 
			Game_Update_Level(); 
		} 
		break; 
	case GAME_STATE_RUN:			//正常运行 
		{ 
			Game_Run(); 
		} 
		break; 
	case GAME_STATE_SHUTDOWN:		//结束游戏 
		{ 
			Game_Shut_Down(); 
		} 
		break; 
	case GAME_STATE_EXIT:			//退出游戏 
		{ 
			Game_Exit(); 
		} 
		break; 
	} 
	return (1); 
} 
//初始化游戏 
int CGame::Game_Init() 
{ 
	m_black_box.DD_Init(); 
	m_game_state=GAME_STATE_UPDATE_LEVEL; 
 
	InitScore(); 
 
	ShowCursor(false); 
 
	return (1); 
} 
//处理升级 
int CGame::Game_Update_Level() 
{ 
	if(m_score>=UPDATE_SCORE) 
	{ 
		m_level++; 
	} 
 
	m_score=0; 
	m_blocks_hit=0; 
 
	InitBlocks(); 
	InitPaddle(); 
	InitBall(); 
 
	m_game_state=GAME_STATE_RUN; 
 
	return (1); 
} 
//正常运行 
int CGame::Game_Run() 
{ 
	srand((unsigned int)m_black_box.DD_Start_Clock()); 
 
	m_black_box.DD_Fill_Surface(0); 
 
	Process_Ball(); 
 
	DrawPaddle(); 
	DrawBlocks(); 
	DrawBall(); 
	UpdateText(); 
 
	m_black_box.DD_Flip(); 
	 
	if(KEY_DOWN(VK_ESCAPE)) 
	{ 
		m_game_state=GAME_STATE_SHUTDOWN; 
	} 
 
	m_black_box.DD_Wait_Clock(30); 
 
	return (1); 
} 
//结束游戏 
int CGame::Game_Shut_Down() 
{ 
	m_black_box.DD_ShutDown(); 
	 
	PostMessage(g_h_wnd,WM_CLOSE,0,0); 
	 
	m_game_state=GAME_STATE_EXIT; 
 
	return (1); 
} 
//退出游戏 
int CGame::Game_Exit() 
{ 
	ShowCursor(true); 
 
	return (1); 
} 
/*######################################################################################### 
*初始化代码 
##########################################################################################*/ 
//初始化分数 
void CGame::InitScore() 
{ 
	m_score=0; 
	m_level=0; 
	m_blocks_hit=0; 
} 
//初始化所有方块 
void CGame::InitBlocks() 
{ 
	int row,col; 
	for(row=0;row=0 && dy>=0 ) 
			{ 
				bRet=true; 
				MessageBeep(MB_OK); 
 
				//撞到方块了,应该加分 
				m_score+=HIT_BLOCK; 
 
				m_blocks_hit++; 
				m_blocks[row][col]=0; 
 
				if(m_blocks_hit>=block_num)//所有方块都撞了,升级了 
				{ 
					m_game_state=GAME_STATE_UPDATE_LEVEL; 
				} 
 
				if(dx>dy)		//vx不变,vy取反 
				{ 
					m_ball_dy=-m_ball_dy; 
				} 
				else if(dx==dy)	//vx、vy都取反 
				{ 
					m_ball_dx=-m_ball_dx; 
					m_ball_dy=-m_ball_dy; 
				} 
				else			//vy不变,vx取反 
				{ 
					m_ball_dx=-m_ball_dx; 
				} 
			} 
		} 
	} 
 
	return bRet; 
} 
//检查小球是否撞到了滑块上 
bool CGame::BallHitPaddle() 
{ 
	bool bRet=false; 
 
	int dx,dy,xr,yr; 
 
	xr=BALL_SIZE/2+PADDLE_WIDTH/2; 
	yr=BALL_SIZE/2+PADDLE_HEIGHT/2; 
	dx=xr-abs(m_ball_x-m_paddle_x); 
	dy=yr-abs(m_ball_y-m_paddle_y); 
 
	if( (m_ball_dy>0) && (dy>=0) && (dx>=0) )//撞到了 
	{ 
		bRet=true; 
		MessageBeep(MB_OK); 
		 
		if(dx>dy)		//vx不变,vy取反 
		{ 
			m_ball_dy=-m_ball_dy; 
			m_ball_dy+=-1+rand()%3; 
			 
			if(m_ball_dy>0) 
			{ 
				if(m_ball_dy>BALL_MAX_DY) 
				{ 
					m_ball_dy=BALL_MAX_DY; 
				} 
				else if(m_ball_dy-BALL_MIN_DY) 
				{ 
					m_ball_dy=-BALL_MIN_DY; 
				} 
			} 
 
			if(KEY_DOWN(VK_RIGHT)) 
			{ 
				m_ball_dx+=rand()%3; 
			} 
			if(KEY_DOWN(VK_LEFT)) 
			{ 
				m_ball_dx-=rand()%3; 
			} 
		} 
		else if(dx==dy)	//vx、vy都取反 
		{ 
			m_ball_dx=-m_ball_dx; 
			m_ball_dy=-m_ball_dy; 
		} 
		else			//vy不变,vx取反 
		{ 
			m_ball_dx=-m_ball_dx; 
		} 
	} 
 
	return bRet; 
} 
//计算小球下一个位置 
void CGame::Process_Ball() 
{ 
	m_ball_x+=m_ball_dx; 
	m_ball_y+=m_ball_dy; 
 
	if(m_ball_x>=WINDOW_WIDTH || m_ball_x<=0) 
	{ 
		MessageBeep(MB_OK); 
		m_ball_dx=-m_ball_dx; 
	} 
	if(m_ball_y>=WINDOW_HEIGHT || m_ball_y<=0) 
	{ 
		if(m_ball_y>=WINDOW_HEIGHT)//撞地了,应该扣分 
		{ 
			m_score+=HIT_GROUND; 
		} 
 
		MessageBeep(MB_OK); 
		m_ball_dy=-m_ball_dy; 
	} 
 
	UpdatePaddlePalce(); 
	BallHitBlock(); 
	BallHitPaddle(); 
} 
//更新滑块位置 
void CGame::UpdatePaddlePalce() 
{ 
	int rx=PADDLE_WIDTH/2; 
 
	if(KEY_DOWN(VK_LEFT)) 
	{ 
		m_paddle_x-=PADDLE_DX; 
	} 
	else if(KEY_DOWN(VK_RIGHT)) 
	{ 
		m_paddle_x+=PADDLE_DX; 
	} 
 
	if(m_paddle_xWINDOW_WIDTH-rx) 
	{ 
		m_paddle_x=WINDOW_WIDTH-rx; 
	} 
} 
//更新文字 
void CGame::UpdateText() 
{ 
	sprintf(m_temp_buf,"F R E A K O U T"); 
    m_black_box.Draw_Text_GDI(m_temp_buf, 8,WINDOW_HEIGHT-16, 127); 
 
	sprintf(m_temp_buf,"Vx=%d,Vy=%d",m_ball_dx,m_ball_dy); 
	m_black_box.Draw_Text_GDI(m_temp_buf, 8,WINDOW_HEIGHT-32, 127); 
 
	sprintf(m_temp_buf,"Score=%d,Level=%d",m_score,m_level); 
	m_black_box.Draw_Text_GDI(m_temp_buf, 8,WINDOW_HEIGHT-48, 127); 
}