📄 game.cpp
字号:
// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TestGame.h"
#include "Game.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/////////////////////////////////
void TransparentBlt2( HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 设置透明色
SetBkColor(hImageDC, crTransparent);
// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
//////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------
//函数名: GetModuleDir()
//入口参数: 无
//出口参数: 无
//返回值: 无
//日期: 2002.3.16
//说明: 获得当前模块的路径
//----------------------------------------------------------------------
CString GetModuleDir()
{
CString strModule;
TCHAR szFullPath[MAX_PATH];
TCHAR szdrive[MAX_PATH];
TCHAR szdir[MAX_PATH];
::GetModuleFileName(NULL,szFullPath,MAX_PATH);
_splitpath(szFullPath,szdrive,szdir,NULL,NULL);
strModule.Format(_T("%s%s"),szdrive,szdir);
return strModule;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGame::CGame(CWnd* pWnd)
{
pGWnd = pWnd;
}
CGame::~CGame()
{
if(m_pThread)
{
//结束线程
m_ExistEvent.SetEvent();
Sleep(300);
}
if ( g_hBufDC != NULL )
{
DeleteDC(g_hBufDC);
}
if ( g_hMapDC != NULL )
{
DeleteDC(g_hMapDC);
}
if ( g_hBusDC != NULL )
{
DeleteDC(g_hBusDC);
}
if ( g_hLifeDC != NULL )
{
DeleteDC(g_hLifeDC);
}
if ( g_hGameOverDC != NULL )
{
DeleteDC(g_hGameOverDC);
}
if ( g_hBomDC != NULL )
{
DeleteDC(g_hBomDC);
}
if ( dPlane.hDevDC != NULL )
{
DeleteDC(dPlane.hDevDC);
}
if ( dBulletL.hDevDC != NULL )
{
DeleteDC(dBulletL.hDevDC);
}
if ( dBulletR.hDevDC != NULL )
{
DeleteDC(dBulletR.hDevDC);
}
if ( dBom.hDevDC != NULL )
{
DeleteDC(dBom.hDevDC);
}
if ( dEmyPlane.hDevDC != NULL )
{
DeleteDC(dEmyPlane.hDevDC);
}
if ( dEmyBlast.hDevDC != NULL )
{
DeleteDC(dEmyBlast.hDevDC);
}
if ( dEmyBullet.hDevDC != NULL )
{
DeleteDC(dEmyBullet.hDevDC);
}
if ( dEmyBom.hDevDC != NULL )
{
DeleteDC(dEmyBom.hDevDC);
}
if ( g_EmyPlane2DC != NULL )
{
DeleteDC(g_EmyPlane2DC);
}
if ( g_EmyBullet1 != NULL )
{
DeleteDC(g_EmyBullet1);
}
if ( g_EmyBullet2 != NULL )
{
DeleteDC(g_EmyBullet2);
}
if ( dEmyBoss.hDevDC != NULL )
{
DeleteDC(dEmyBoss.hDevDC);
}
if ( dEmyBossBal.hDevDC != NULL )
{
DeleteDC(dEmyBossBal.hDevDC);
}
if ( g_EmyBossBlast != NULL )
{
DeleteDC(g_EmyBossBlast);
}
}
BOOL CGame::InitialGame()
{
HBITMAP hBitMap = NULL;
CString strTempFile = "";
HDC hDC;
hDC = GetDC(pGWnd->m_hWnd);
g_hBufDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\bufPC.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hBufDC,hBitMap);
g_hMapDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\map1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hMapDC,hBitMap);
g_hLifeDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\life.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hLifeDC,hBitMap);
g_hGameOverDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\GameEnd.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hGameOverDC,hBitMap);
//我方装备初始化
dPlane.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\Center.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dPlane.hDevDC,hBitMap);
g_hBusDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\dead.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hBusDC,hBitMap);
g_hBomDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\thunder.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_hBomDC,hBitMap);
dBulletL.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\ball.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dBulletL.hDevDC,hBitMap);
dBulletR.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\ball.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dBulletR.hDevDC,hBitMap);
dBom.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\thunder.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dBom.hDevDC,hBitMap);
//敌方装备初始化
dEmyPlane.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\foe1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyPlane.hDevDC,hBitMap);
dEmyBlast.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\dead.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBlast.hDevDC,hBitMap);
g_EmyPlane2DC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\foe2.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_EmyPlane2DC,hBitMap);
g_EmyBullet1 = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\ball1.BMP";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_EmyBullet1,hBitMap);
g_EmyBullet2 = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\ball2.BMP";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_EmyBullet2,hBitMap);
//Boss
dEmyBoss.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\Boss1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBoss.hDevDC,hBitMap);
dEmyBossBal.hDevDC = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\bossbal1.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(dEmyBossBal.hDevDC,hBitMap);
g_EmyBossBlast = CreateCompatibleDC(hDC);
strTempFile = GetModuleDir() + "\\resource\\dead.bmp";
hBitMap = SHLoadDIBitmap(strTempFile);
SelectObject(g_EmyBossBlast,hBitMap);
DeleteObject(hBitMap);
ReleaseDC(pGWnd->m_hWnd,hDC);
hDC = NULL;
// VOpen();
m_iLevel = 1;
MoveSpeed = 0;
RestAll();
m_pThread = NULL;
//启动播放线程
m_pThread = AfxBeginThread( PlayThread,
this
// THREAD_PRIORITY_BELOW_NORMAL
);
if(m_pThread == NULL)
{
return FALSE;
}
return TRUE;
}
//垂直方向开启屏幕效果
void CGame::VOpen()
{
HDC hDC = GetDC(pGWnd->m_hWnd);
RECT rc;
GetWindowRect(pGWnd->m_hWnd,&rc);
for (int m=0;m<121;m++)
{
BitBlt(hDC,0,rc.top,
ScreenW,(rc.bottom-rc.top),
g_hBufDC,0,rc.top,BLACKNESS);
rc.top -= 2;
rc.bottom += 2;
// ::Sleep(5);
}
CString strTempFile = "";
strTempFile = GetModuleDir() + "\\resource\\open.wav";
PlaySound (strTempFile,NULL,SND_FILENAME|SND_ASYNC);
ReleaseDC(pGWnd->m_hWnd,hDC);
hDC = NULL;
}
//画地图
void CGame::DrawMap()
{
//背景贴图的偏移坐标
static int mapposX=64, mapposY=64;
mapposX--;
if (mapposX<=0 ) mapposX=64;
if (mapposY<=0) mapposY=64;
if (mapposY>64) mapposY=1;
for (int x=0; x<=(int)ScreenW/64; x++)
{
for (int y=0; y<=(int)ScreenH/64; y++)
{
RECT rect;
GetRect(&rect, 64*x-mapposY, 64*y-mapposX, 64, 64);
BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,g_hMapDC,0,0,SRCCOPY);
}
}
}
//填充一个RECT结构
void CGame::GetRect(RECT* rect, long left, long top, long width, long height)
{
rect->left = left;
rect->top = top;
rect->right = left+width;
rect->bottom = top+height;
return;
}
//场景更换
void CGame::UpdateFrame()
{
/* if (nPlaneLife <= 0)
{
return;
}*/
//开火:A键
if(GetAsyncKeyState(0x41))
{
Fire();
}
//放雷:S键
if(GetAsyncKeyState(0x53))
FlashScreen();
DrawMap();
Check();
CheckBoss();
DrawPlane();
DrawBullet();
DrawEmyPlane();
DrawBlast();
DrawEmyBoss();
DrawScore();
DrawFlip();
PassLevel();
}
//画我机
void CGame::DrawPlane()
{
if (nPlaneLife <= 0)
{
return;
}
static DWORD dOldTime = 0;
if ( dPlane.bDeadFlag[0] == 1 && nPlaneLife > 0 )
{
dPlane.DevRect[0].left = ScreenW/2 - 25;
dPlane.DevRect[0].top = ScreenH - 50;
dOldTime = GetTickCount();
m_bNewReset = TRUE;
m_bCanControl = FALSE;
dPlane.bDeadFlag[0] = 0;
}
if (TRUE == m_bNewReset)
{
if (GetTickCount()>dOldTime+3000) //重新初始化,无敌时间3秒
{
m_iBomb = 4;
m_bNewReset = FALSE;
}
}
if (FALSE == m_bCanControl)
{
if (dPlane.DevRect[0].top > ScreenH - 150) //飞机刚出现不受控制
dPlane.DevRect[0].top -= dPlane.MoveSpeed[0];
else
m_bCanControl = TRUE;
}
else
{
//检测飞机控制键
if(GetAsyncKeyState(VK_UP))
ControlPlanePos(VK_UP);
if(GetAsyncKeyState(VK_DOWN))
ControlPlanePos(VK_DOWN);
if(GetAsyncKeyState(VK_LEFT))
ControlPlanePos(VK_LEFT);
if(GetAsyncKeyState(VK_RIGHT))
ControlPlanePos(VK_RIGHT);
}
if (TRUE == m_bNewReset) //无敌时的闪烁效果
{
static int ot=0; //延时
if (GetTickCount()-ot > 30)
ot = GetTickCount();
else
return;
}
//绘制飞机
if ( dPlane.bDeadFlag[0] == 0 )
{
RECT rect;
// GetRect(&rect, 200, 300, 50, 60);
rect = dPlane.DevRect[0];
COLORREF crMask = RGB(0x00,0x00,0x00);
BitBlt(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,dPlane.hDevDC ,0,0,SRCINVERT);
//透明处理---为什么会很慢呢?????
// TransparentBlt2(g_hBufDC,rect.left,rect.top,ScreenW,ScreenH,dPlane.hDevDC ,0,0,ScreenW, ScreenH,crMask);
}
else
{
dPlane.DevRect[0].left = -100;
dPlane.DevRect[0].top = -100;
}//////////////////////////////*/
}
//画我机子弹
void CGame::DrawBullet()
{
if (nPlaneLife <= 0)
{
return;
}
for (int i=0; i<DEVNUMS; i++)
{
RECT rcL,rcR;
rcL.left = dBulletL.DevRect[i].left;
rcL.top = dBulletL.DevRect[i].top;
rcL.right = rcL.left + 10;
rcL.bottom = rcL.top + 20;
rcR.left = dBulletR.DevRect[i].left;
rcR.top = dBulletR.DevRect[i].top;
rcR.right = rcR.left + 10;
rcR.bottom = rcR.top + 20;
BitBlt(g_hBufDC,rcL.left,rcL.top,ScreenW,ScreenH,dBulletL.hDevDC,0,0,SRCINVERT);
BitBlt(g_hBufDC,rcR.left,rcR.top,ScreenW,ScreenH,dBulletR.hDevDC,0,0,SRCINVERT);
dBulletL.DevRect[i].left --;
dBulletL.DevRect[i].top -= 26;
dBulletR.DevRect[i].left ++;
dBulletR.DevRect[i].top -= 26;
}
}
//开火
void CGame::Fire()
{
if (nPlaneLife <= 0)
{
return;
}
static int newtime,oldtime = GetTickCount();
newtime = GetTickCount();
if (newtime > oldtime+150)
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_SHOT),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
oldtime = newtime;
dBulletL.DevRect[m_iBallNum].left = dPlane.DevRect[0].left + 10;
dBulletL.DevRect[m_iBallNum].top = dPlane.DevRect[0].top;
dBulletR.DevRect[m_iBallNum].left = dPlane.DevRect[0].left + 30;
dBulletR.DevRect[m_iBallNum].top = dPlane.DevRect[0].top;
m_iBallNum ++;
if (m_iBallNum == DEVNUMS)
m_iBallNum = 0;
}
}
//画BOSS子弹
void CGame::DrawEmyBossBal()
{
RECT rect;
int i;
switch(m_iLevel)
{
case 5:
case 2:
case 3:
case 4:
case 1:
//子弹消失了,重发
if(TRUE == m_bBossBalClr)
{
m_bBossBalClr = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -