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_x WINDOW_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); }