📄 g2.cpp
字号:
//子弹移动
if( !bullet->Move() )
{ //子弹失效时处理
bullet->m_active = FALSE;
continue;
}
//子弹打中敌人
//-----------------------------------------------
for( i = 0; i < m_nMaxEnemys; i ++ )
{
if( !m_enemy[i].m_bBoring &&
bullet->HitTest( m_enemy[i] ) )
{
// our bullet hit the enemy
bullet->m_active = FALSE;
//爆炸
//// Explode( *bullet );
m_enemy[i].m_active = FALSE;
if( !m_enemy[i].m_active )
{
// the enemy is dead
// Explode( m_enemy[i], TRUE );
//m_DirectSound.Play( EFFECT_EXPLODE );
BoreBonus(m_enemy[i].m_x,m_enemy[i].m_y);
m_nEnemys --;
m_player[k].m_nScore += 100;
}
break;
}
} //子弹打中敌人(END)
//-----------------------------------------------
}//玩家子弹处理(END)
//------------------------------------------------------
}//玩家处理END
//+++++++++++++++++++++++++++++++++
// 敌人的处理区
//+++++++++++++++++++++++++++++++++
if(m_bEnemyLocked)
if((timeGetTime()-m_lockTime)>5000) m_bEnemyLocked=false;
//五秒后解锁
///-------
for( i = 0; i < m_nMaxEnemys&&!m_bEnemyLocked; i ++ )
{
//活动的,没在生的(移动和转向)
//-----------
if(!m_enemy[i].m_bBoring&&
m_enemy[i].m_active )
{
x = m_enemy[i].m_x;
y = m_enemy[i].m_y;
dir = m_enemy[i].m_dir;
//走不动的的必转方向,走动的有0.5%概率转方向
if( rand() % 200 == 0 ||
!m_enemy[i].Move() )
{
m_enemy[i].ChangeDirection();
}
}
//-----------
///检测是否敌方碰到了
//-------------------------
for( int j = 0; j < m_nMaxEnemys; j ++ )
{
if( i != j &&
m_enemy[i].HitTest( m_enemy[j], x, y ) )
{
// two enemys hit each other
m_enemy[i].ChangeDirection();
/*
//改变方向后还是碰了,就还原吧
if( m_enemy[i].HitTest( m_enemy[j], x, y ) )
{
m_enemy[i].m_x = x;
m_enemy[i].m_y = y;
m_enemy[i].m_dir = dir;
}
*/
break;
}
}///检测是否敌方碰到了(END)
//-------------------------
//有1%概率开火
if( rand() % 50 == 0 )
m_enemy[i].Fire();
//检测敌方子弹的碰击
//-----------
bullet = &m_enemy[i].m_bullet[0];
if( bullet->m_active )
{
if( !bullet->Move() )
bullet->m_active = FALSE;
}
for(k=0;k<2;k++)
if(bullet->HitTest(m_player[k]))
{
bullet->m_active = FALSE;
m_player[k].m_nLife--;
if(m_player[k].m_nLife<0)
{
m_player[k].m_active=FALSE;
m_gameState=GS_OVER;
}
}
//-----------
} // process enemys(END)
//(For 语句)活动的,没在生的(移动和转向)(END)
lastTick = timeGetTime();
}
// produce some enemys...
static DWORD lastTime=0;
DWORD thisTime = timeGetTime();
//3 Sec后 就产生敌人
if( thisTime - lastTime > 3000 )
{
lastTime = thisTime;
BoreEnemy();
}
}
// surface = m_plane.GetSurface( m_enemy[i] );
// if( surface == OBJ_BRICK )
// {//如果是墙有70%是开火,30%转方向
/* if( rand() % 100 < 30 )
{
m_enemy[i].ChangeDirection();
// surface = m_plane.GetSurface( m_enemy[i] );
}
else
m_enemy[i].Fire();
*/
// }
// else if( surface == OBJ_CONCRETE ||
// surface == OBJ_RIVER )
// {//如是水泥或河流,转方向
// m_enemy[i].ChangeDirection();
// surface = m_plane.GetSurface( m_enemy[i] );
// }
//如果跟玩家碰了,开火
/* if( m_enemy[i].HitTest( m_player[0], (int)x, (int)y ) ||
m_enemy[i].HitTest( m_player[1], (int)x, (int)y ) )
{
m_enemy[i].m_x = x;
m_enemy[i].m_y = y;
m_enemy[i].m_dir = dir;
m_enemy[i].Fire();
}//如果还是前面没路,还原
else if( surface != OBJ_NULL && surface != OBJ_TREE )
{
m_enemy[i].m_x = x;
m_enemy[i].m_y = y;
m_enemy[i].m_dir = dir;
}
*/
////////////////////////////////////////////////////////
//Load all the Bitmap or Create DC
////////////////////////////////////////////////////////
BOOL CGame::DDInit()
{
m_hWnd=HWnd;
hdc=GetDC(m_hWnd);
hdcMem=CreateCompatibleDC(hdc);
hdcBuff=CreateCompatibleDC(hdc);
hdcMem_Test=CreateCompatibleDC(hdc);
hbm=CreateCompatibleBitmap(hdc,700,500);
hTest_bmp=CreateCompatibleBitmap(hdc,53,49);
SelectObject(hdcMem,hbm);
SelectObject(hdcMem_Test,hTest_bmp);
//=h_pic
m_pBmpList[0]=(HBITMAP)LoadImage(NULL,"pic\\Sky.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
//h_ball
m_pBmpList[1]=(HBITMAP)LoadImage(NULL,"pic\\位图_126.bmp",IMAGE_BITMAP,13,13,LR_LOADFROMFILE);
/*
//h_Killer
//m_pBmpList[1]=(HBITMAP)LoadImage(NULL,"Killer.bmp",IMAGE_BITMAP,106,49,LR_LOADFROMFILE);
//Enemy
*/
m_pBmpList[2]=(HBITMAP)LoadImage(NULL,"pic\\Enemy.BMP",IMAGE_BITMAP,336,268,LR_LOADFROMFILE);
//bore-Enemy
m_pBmpList[3]=(HBITMAP)LoadImage(NULL,"pic\\bore.bmp",IMAGE_BITMAP,560,71,LR_LOADFROMFILE);
//player 1
m_pBmpList[4]=(HBITMAP)LoadImage(NULL,"pic\\Player1.BMP",IMAGE_BITMAP,288,256,LR_LOADFROMFILE);
//bore-Player
m_pBmpList[5]=(HBITMAP)LoadImage(NULL,"pic\\Player1Bore.bmp",IMAGE_BITMAP,480,64,LR_LOADFROMFILE);
//h_Popo
m_pBmpList[6]=(HBITMAP)LoadImage(NULL,"pic\\Popo.bmp",IMAGE_BITMAP,132,41,LR_LOADFROMFILE);
//h_heart
m_pBmpList[7]=(HBITMAP)LoadImage(NULL,"pic\\heart.bmp",IMAGE_BITMAP,19,19,LR_LOADFROMFILE);
//h_explode
m_pBmpList[8]=(HBITMAP)LoadImage(NULL,"pic\\Explosion.bmp",IMAGE_BITMAP,560,200,LR_LOADFROMFILE);
//h_bouns-list
m_pBmpList[9]=(HBITMAP)LoadImage(NULL,"pic\\Gift3.bmp",IMAGE_BITMAP,126,45,LR_LOADFROMFILE);
m_pBmpList[10]=(HBITMAP)LoadImage(NULL,"pic\\Gift5.bmp",IMAGE_BITMAP,126,45,LR_LOADFROMFILE);
m_pBmpList[11]=(HBITMAP)LoadImage(NULL,"pic\\Gift6.bmp",IMAGE_BITMAP,126,45,LR_LOADFROMFILE);
m_pBmpList[12]=(HBITMAP)LoadImage(NULL,"pic\\Gift1.bmp",IMAGE_BITMAP,126,45,LR_LOADFROMFILE);
m_pBmpList[13]=(HBITMAP)LoadImage(NULL,"pic\\GiftTurtle.bmp",IMAGE_BITMAP,108,41,LR_LOADFROMFILE);
//m_pBmpList[14]=(HBITMAP)LoadImage(NULL,"GiftTurtle.bmp",IMAGE_BITMAP,126,45,LR_LOADFROMFILE);
//m_pBmpList[3]=(HBITMAP)LoadImage(NULL,"explode.bmp",IMAGE_BITMAP,92,370,LR_LOADFROMFILE);
//m_pBmpList[5]=h_heart=(HBITMAP)LoadImage(NULL,"heart.bmp",IMAGE_BITMAP,19,19,LR_LOADFROMFILE);
//m_pBmpList[6]=h_Frame=(HBITMAP)LoadImage(NULL,"位图_296.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
// GetObject (h_pic, sizeof (BITMAP), &bitmap) ;
// cxSource=bitmap.bmWidth;
// cySource=bitmap.bmHeight;
// */
////////////////////////////////////////////////////
//加载
//player1.bmp bullet.bmp bore.bmp shield.bmp
m_player[0].BitBlt( &m_pBmpList[4], &m_pBmpList[1], &m_pBmpList[5]);
for( int j = 0; j < 2; j ++ )
m_player[0].m_explode[j].BitBlt(&m_pBmpList[6],&m_pBmpList[8]);
///敌人
for( int i = 0; i < NUM_ENEMYS; i ++ )
m_enemy[i].BitBlt(&m_pBmpList[2], &m_pBmpList[1],&m_pBmpList[3]);
return true;
}
////////////////////////////////////////////////////////
//游戏初始化
////////////////////////////////////////////////////////
BOOL CGame::InitGame()
{
srand( timeGetTime() );//播下种子
/*
// initialize input devices
m_DirectInput.Create( m_hInst, m_hWnd );
// initizlize sound effects
m_DirectSound.Init( m_hWnd );
*/
//设置两个玩家,数据
m_player[0].Create( 48, 64, TRUE );
m_player[1].Create( 28, 28, FALSE );
//for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
m_player[0].m_explode[j].m_active=false;
//Create敌人 但是暂时无效
for( int i = 0; i < NUM_ENEMYS; i ++ )
m_enemy[i].Create( 56, 67, FALSE );
//Create爆炸 但是暂时无效
// for( i = 0; i < NUM_EXPLODES; i ++ )
// m_explode[i].Create( 28, 28, FALSE );
/*
//Create奖励 但是暂时无效
m_bonus.Create( 30, 28, FALSE );
*/
//在选择界面
m_gameState = GS_ACTIVE;
return TRUE;
}
////////////////////////////////////////////////////////
//初始化(总控制)
////////////////////////////////////////////////////////
BOOL CGame::Initialize( HINSTANCE hInst )
{
m_hInst = hInst;
if( !DDInit() || !InitGame() )
{
DDTerm();
return FALSE;
}
//后做修改本身没有
ResetGame();
return TRUE;
}
////////////////////////////////////////////////////////
//InitLevel()等级初始化
//
///////////////////////////////////////////////////////
BOOL CGame::InitLevel()
{
for( int i = 0; i < NUM_ENEMYS; i ++ )
{
m_enemy[i].m_active = FALSE;
m_enemy[i].m_bullet[0].m_active = FALSE;
}
m_bonus.m_active = FALSE;
m_nEnemysLeft = m_nEnemys = 20;
for(i=0;i<2;i++)
for(int j=0;j<2;j++)
{ m_player[i].m_explode[j].m_explode=false;
m_player[i].m_explode[j].m_active = FALSE;
}
m_bEnemyLocked=false;
return TRUE;
}
//////////////////////////////////////////////////
///RestGame 游戏截面开始的初始化-m_nMaxEnemys,m_gameState,m_bActive
//也调用了 InitLevel();
////////////////////////////////////////////////
BOOL CGame::ResetGame()
{
m_nMaxEnemys = 4;
m_gameState = GS_ACTIVE;
m_bActive=true;
ResetPlayer(m_player[0]);
return InitLevel();
}
//
void CGame::ResetPlayer( CPlayer& player )
{
if( &player == &m_player[0] )
{
player.m_x = PLAYER1_STARTX;
player.m_y = PLAYER1_STARTY;
}
else
{
player.m_x = PLAYER2_STARTX;
player.m_y = PLAYER2_STARTY;
}
player.Reborn();
}
//
////////////////////////////////////////////////////////
//Relase memery.It is a VIP .
//
////////////////////////////////////////////////////////
void CGame::DDTerm()
{
/* for( int i = 0; i < NUM_BITMAPS; i ++ )
SAFE_RELEASE( m_pBmpList[i] );
if( !m_bFullScreen )
SAFE_RELEASE( m_pddsBackBuffer );
SAFE_RELEASE( m_pddsFrontBuffer );
SAFE_RELEASE( m_pDD );*/
}
//
//
////////////////////////////////////////////////////////
//Enter of this Programe
////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_G2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_G2);
//////////////////////////////////////////////////
///游戏的开始
CGame game;
game.Initialize( hInst );
return game.Run();
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_G2);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_G2;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
// HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
HWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!HWnd)
{
return FALSE;
}
ShowWindow(HWnd, nCmdShow);
UpdateWindow(HWnd);
MoveWindow(HWnd,50,15,800,600,true);
return true;
}
//
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -