📄 main.cpp
字号:
// 创建DirectDraw对象
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if (ddrval != DD_OK )
return FALSE;
// 取得全屏独占模式
ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if (ddrval != DD_OK )
return FALSE;
// 设置显示器显示模式为640x480x256(8bit)色
ddrval = lpDD->SetDisplayMode( 640, 480, 16);
if (ddrval != DD_OK )
return FALSE;
// 填充换页链结构
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
// 指定后台缓冲区数量为1
ddsd.dwBackBufferCount = 1;
// 创建换页链,包括了主页面及其后台缓冲区
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if (ddrval != DD_OK )
return FALSE;
// 获得指向后台缓冲区的页面指针
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
if (ddrval != DD_OK )
return FALSE;
// 创建与主页面等大小的两个离屏页面
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = 640;
ddsd.dwHeight = 480;
if (lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth = 1980;
ddsd.dwHeight = 320; // 60X80 x(16+1+16) X 4
if (lpDD->CreateSurface(&ddsd, &lpDDSPic2, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=340;
ddsd.dwHeight=200; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPic3, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=220;
ddsd.dwHeight=480; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPic4, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=220;
ddsd.dwHeight=480; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPic5, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=200;
ddsd.dwHeight=480; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPic6, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=300;
ddsd.dwHeight=200; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPic7, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=640;
ddsd.dwHeight=2400; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPic8, NULL) != DD_OK)
return FALSE;
ddsd.dwWidth=100;
ddsd.dwHeight=200; // 创建辅助离屏页面
if (lpDD->CreateSurface(&ddsd, &lpDDSPig, NULL) != DD_OK)
return FALSE;
// 从磁盘文件或者资源中载入调色板
lpDDPal = DDLoadPalette(lpDD, "IDB_TITLE");
// 将调色板设置给主页面
if (lpDDPal)
lpDDSPrimary->SetPalette( lpDDPal );
// 初始化音频设备
if (cDSound.Init(hWndMain))bSoundDrive=true;
// 调用页面初始化函数
// if (!InitThread() )
// return FALSE;
return TRUE;
}
// ******************************************************************
// 函数:WinMain()
// 功能:应用程序入口
// ******************************************************************
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
hInst=hInstance;
// 初始化主窗口
if (!InitWindow( hInstance, nCmdShow))
return FALSE;
// 初始化DirectDraw环境
if (!InitDDraw())
{
MessageBox(hWndMain, "初始化DirectDraw过程中出错!", "Error", MB_OK);
FreeResource(); // 释放资源
DestroyWindow(hWndMain);
return FALSE;
}
SetTimer(hWndMain,1,100,NULL); // 动画切换计时器
SetTimer(hWndMain,2,20,NULL); // 动画切换计时器2
// 进入消息循环
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) // 程序处于激活状态
{
MainLoop();
}
else WaitMessage(); // 否则等待
}
// return msg.wParam;
}
// ******************************************************************
// 函数:InitTitle()
// 功能:初始化页面图象
// ******************************************************************
BOOL InitThread( void )
{
bInitAgain=false;
HBITMAP hbm;
switch (iThread)
{
case 0: // 序
ShowCursor(FALSE); // 隐藏光标
if (bSoundDrive)
{
cDSound.SetTrack("wav\\info.wav",0);
// cDSound.SetTrack("wav\\di1.wav",1);
cDSound.Play(false,0);
}
hbm = (HBITMAP)LoadImage(hInst, "IDB_TITLE", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if (hbm == NULL)
return FALSE;
DDCopyBitmap(lpDDSPic3, hbm, 300, 680, 340, 200);
// 释放hbm位图对象
DeleteObject(hbm);
return true;
case 1: // 菜单
cDSound.SetTrack("wav\\gun.wav",1);
cDSound.SetTrack("wav\\ack.wav",2);
cDSound.SetTrack("wav\\dead.wav",3);
cDSound.SetTrack("wav\\fire.wav",4);
iSelectMainMenuNo=1;
// 从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
hbm = (HBITMAP)LoadImage(hInst, "IDB_TITLE", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); // |LR_LOADFROMFILE);
if (hbm == NULL)
return FALSE;
DDCopyBitmap(lpDDSPic1, hbm, 0, 0, 640, 480);
DDCopyBitmap(lpDDSPic7, hbm, 0, 680, 300, 200);
DDCopyBitmap(lpDDSPig, hbm, 0, 0, 100, 200);
DDSetColorKey(lpDDSPic1, CLR_INVALID);
DDSetColorKey(lpDDSPic7, CLR_INVALID);
DDSetColorKey(lpDDSPig, CLR_INVALID);
// 释放hbm位图对象
DeleteObject(hbm);
return true;
case 3: // 开始1关
// ShowCursor(false); // 隐藏光标
// FILE *fin;
// fin=fopen("data\\enemy.001","rb");
// if (fin==NULL)
// return false;
// for(i=0;i<512;i++)
// for(j=0;j<512;j++)
// fscanf(fin,"%d",&iEnemyWay[i][j]);
// fprintf(fin,"200\r\n");
// fclose(fin);
iFX=300;
iFY=400;
iFSpeed=2;
int i;
// ,j=0;
for (i=0;i<40;i++)
{
// if (j==0)j=1;
// else j=0;
iBomX[i]=-100;
iBomY[i]=-100;
bBomBI[i]=false;
}
cMidi.Stop();
cMidi.ChangePlay("wav\\fight.mid");
// 从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
hbm = (HBITMAP)LoadImage(hInst, "IDB_FJ1", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); // |LR_LOADFROMFILE);
if (hbm == NULL)
return FALSE;
DDCopyBitmap(lpDDSPic1, hbm, 0, 0, 640, 480); // 设置一个640*480的页面
DDSetColorKey(lpDDSPic1, CLR_INVALID);
// 释放hbm位图对象
DeleteObject(hbm);
hbm = (HBITMAP)LoadImage(hInst, "IDB_FJ01", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); // |LR_LOADFROMFILE);
if (hbm == NULL)
return FALSE;
DDCopyBitmap(lpDDSPic2, hbm, 0, 0, 1980, 320);
DDSetColorKey(lpDDSPic2, CLR_INVALID);
// 设置一个1980 x 320 的页面
// 释放hbm位图对象
DeleteObject(hbm);
hbm = (HBITMAP)LoadImage(hInst, "pic\\map01.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
// LR_CREATEDIBSECTION如果缺少,将导致颜色偏差
if (hbm == NULL)
return FALSE;
DDCopyBitmap(lpDDSPic8, hbm, 0, 0, 640, 2400);
DDSetColorKey(lpDDSPic8, CLR_INVALID);
// 设置一个640 x 2400 的页面
// 释放hbm位图对象
DeleteObject(hbm);
return true;
}
return false;
}
// 更新屏幕
void MainLoop( void ) // 程序循环
{
// 计算刷新率
static int siFrame=0, siNewTime=0, siOldTime=0;
static int siNewUpTime=0,siOldUpTime=0;
siFrame++;
siNewTime=timeGetTime();
siNewUpTime=siNewTime;
if (siNewTime > siOldTime+1000)
{
siOldTime=siNewTime;
iFps=siFrame;
siFrame=0;
iDelayB=iFps/48;
}
if (siNewUpTime>siOldUpTime+2)
{
siOldUpTime=siNewUpTime;
iMoveTitleStep+=1;
// bMoveFlag=true;
}
if (bInitAgain)
{
if (InitThread()==false)
{
iThread=999;
QuitOneThread();
}
}
switch (iThread)
{
case 0: // info display
InfoDisplay();
break;
case 1: // title display
/*TitleDisplay();
break;
case 2:*/
MainMenu();
break;
case 3:
LetGo();
break;
}
}
void SetRect(RECT *rect, long left, long top, long right, long bottom)
{
rect->left=left;
rect->top=top;
rect->right=right;
rect->bottom=bottom;
}
void InfoDisplay()
{
HRESULT ddrval;
static n=0;
RECT backR1, frontR1;
SetRect(&backR1, 0, 0, 340, 200);
SetRect(&frontR1, 150,150, 490, 350);
// 清屏后台缓冲区
DDBLTFX ddBltFx;
ddBltFx.dwSize = sizeof(DDBLTFX);
ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
// 将背景图象Blit到后台缓冲区
lpDDSBack->Blt(&frontR1, lpDDSPic3, &backR1, DDBLT_WAIT, NULL);
if (bTimeToUp) // 没有按Esc时自动计时
{
bTimeToUp=false;
n+=1;
if (n>100)
{
// FreeThread();
// iThread=1;
// bInitAgain=true;
QuitOneThread();
}
}
// 打印刷新率fps
HDC hdc;
char temp[32];
lpDDSBack->GetDC(&hdc);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(0,255,0));
sprintf(temp, "%d 帧/秒", iFps);
TextOut(hdc, 0, 0, temp, strlen(temp));
lpDDSBack->ReleaseDC(hdc);
// 换页
while ( 1 )
{
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT ); // 调用换页函数
if (ddrval == DD_OK ) // 成功则退出while循环
break;
if (ddrval == DDERR_SURFACELOST ) // 如果页面丢失,则恢复页面
{
ddrval = lpDDSPrimary->Restore(); // 恢复主页面
if (ddrval!=DD_OK)
break;
ddrval=lpDDSPic3->Restore(); // 恢复离屏页面3
if (ddrval!=DD_OK)
break;
if (!InitThread())
break; // 重新提取背景
}
if (ddrval != DDERR_WASSTILLDRAWING)
break;
}
}
void MainMenu()
{
HRESULT ddrval;
RECT backR1, frontR1,backR2, frontR2,backR3, frontR3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -