📄 mainfrm.cpp
字号:
{
food[i].exist = FALSE;
blood.helth-=30;
fcount--;
}
break;
case 3: //食物4
//画图
if(food[i].state>=7)
{
food[i].state = 0;
}
food[i].y+=food[i].speed;
g_pDDSBack->BltFast( food[i].x, food[i].y, g_pDDSOne[7],
CRect(food[i].state*FOOD4_WIDTH,0,food[i].state*FOOD4_WIDTH+FOOD4_WIDTH,FOOD4_HEIGHT) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
food[i].state++;
food[i].p[0].x = food[i].x+FOOD4_BOOM_POINT_X1;
food[i].p[0].y = food[i].y+FOOD4_BOOM_POINT_Y1;
food[i].p[1].x = food[i].x+FOOD4_BOOM_POINT_X2;
food[i].p[1].y = food[i].y+FOOD4_BOOM_POINT_Y2;
food[i].p[2].x = food[i].x+FOOD4_BOOM_POINT_X3;
food[i].p[2].y = food[i].y+FOOD4_BOOM_POINT_Y3;
food[i].p[3].x = food[i].x+FOOD4_BOOM_POINT_X4;
food[i].p[3].y = food[i].y+FOOD4_BOOM_POINT_Y4;
if(food[i].y>=SCREENHEIGHT)
{
food[i].exist = FALSE;
fcount--;
}
break;
case 4: //食物5
//画图
if(food[i].state>=2)
{
food[i].state = 0;
}
food[i].y+=food[i].speed;
g_pDDSBack->BltFast( food[i].x, food[i].y, g_pDDSOne[8],
CRect(food[i].state*FOOD5_WIDTH,0,food[i].state*FOOD5_WIDTH+FOOD5_WIDTH,FOOD5_HEIGHT) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
food[i].state++;
food[i].p[0].x = food[i].x+FOOD5_BOOM_POINT_X1;
food[i].p[0].y = food[i].y+FOOD5_BOOM_POINT_Y1;
food[i].p[1].x = food[i].x+FOOD5_BOOM_POINT_X2;
food[i].p[1].y = food[i].y+FOOD5_BOOM_POINT_Y2;
food[i].p[2].x = food[i].x+FOOD5_BOOM_POINT_X3;
food[i].p[2].y = food[i].y+FOOD5_BOOM_POINT_Y3;
food[i].p[3].x = food[i].x+FOOD5_BOOM_POINT_X4;
food[i].p[3].y = food[i].y+FOOD5_BOOM_POINT_Y4;
if(food[i].y>=SCREENHEIGHT)
{
food[i].exist = FALSE;
fcount--;
}
break;
}
}
}
}
void CMainFrame::CreateFood()
{
//增加难度
level=source/10;
if(level != oldlevel)
{
oldlevel = level;
pSBuf[4]->Play(0,0,0);
}
if(level>=10)
{
level = 0;
}
switch(rand()%((fcount+3)*(10-level)))
{
case 0:
for(i=0;i<30;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = MON_HEIGHT-80;
food[i].exist = TRUE;
food[i].type = 0;
food[i].state = 0;
food[i].speed = rand()%(5+2*level)+5;
fcount++;
return;
}
}
case 1:
for(i=0;i<30;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = MON_HEIGHT-80;
food[i].exist = TRUE;
food[i].type = 1;
food[i].state = 0;
food[i].speed = rand()%(5+2*level)+5;
fcount++;
return;
}
}
case 2:
for(i=0;i<30;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = MON_HEIGHT-80;
food[i].exist = TRUE;
food[i].type = 2;
food[i].state = 0;
food[i].speed = rand()%(5+2*level)+5;
fcount++;
return;
}
}
case 3:
for(i=0;i<30;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = MON_HEIGHT-80;
food[i].exist = TRUE;
food[i].type = 3;
food[i].state = 0;
food[i].speed = rand()%(5+2*level)+5;
fcount++;
return;
}
}
case 4:
for(i=0;i<30;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = MON_HEIGHT-80;
food[i].exist = TRUE;
food[i].type = 4;
food[i].state = 0;
food[i].speed = rand()%(5+2*level)+5;
fcount++;
return;
}
}
}
}
void CMainFrame::Blood()
{
if(blood.state>=4)
{
blood.state = 0;
}
if(blood.hstate>=3)
{
blood.hstate =0;
}
if(blood.helth>BLOOD_HEIGHT)
{
blood.helth=BLOOD_HEIGHT;
}
//游戏结束
if(blood.helth<=0)
{
KillTimer(1);
g_pDDSBack->BltFast( 0, OVER_TOP, g_pDDSOne[10],
CRect(0,0,OVER_WIDTH,OVER_HEIGHT) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
pSBuf[0]->Stop();
pSBuf[3]->Play(0,0,0);
}
//画血
g_pDDSBack->BltFast( BLOOD_LEFT, blood.y, g_pDDSOne[9],
CRect(blood.state*BLOOD_WIDTH,0,blood.state*BLOOD_WIDTH+BLOOD_WIDTH,blood.helth)
, DDBLTFAST_WAIT);
//画心脏
g_pDDSBack->BltFast( BLOOD_LEFT - (BLOOD_WIDTH)/2 - (HEART_WIDTH)/4, blood.helth+20, g_pDDSOne[12],
CRect(blood.hstate*HEART_WIDTH,0,blood.hstate*HEART_WIDTH+HEART_WIDTH,HEART_HEIGHT) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
blood.hstate++;
blood.state++;
}
void CMainFrame::EatFood()
{
for(i=0;i<30;i++)
{
if(food[i].exist)
{
//开始监测碰撞
for(j=0;j<4;j++)
{
if(pig.r.PtInRect(food[i].p[j]))
{
switch(food[i].type)
{
case 0:
source+=1;
blood.helth+=5;
pSBuf[2]->Play(0,0,0);
break;
case 1:
source+=2;
blood.helth+=10;
pSBuf[2]->Play(0,0,0);
break;
case 2:
source+=5;
blood.helth+=20;
pSBuf[2]->Play(0,0,0);
break;
case 3:
source+=10;
blood.helth-=150;
g_pDDSBack->BltFast( food[i].p[j].x, food[i].p[j].y-20, g_pDDSOne[11], CRect(0,0,BOOM_WIDTH,BOOM_HEIGHT) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
pSBuf[1]->Play(0,0,0);
break;
case 4:
source+=5;
blood.helth-=100;
g_pDDSBack->BltFast( food[i].p[j].x, food[i].p[j].y-20, g_pDDSOne[11], CRect(0,0,BOOM_WIDTH,BOOM_HEIGHT) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
pSBuf[1]->Play(0,0,0);
break;
}
food[i].exist = FALSE;
fcount--;
break;
}
}
}
}
}
int CMainFrame::ReadWaveFileData(LPCTSTR lpFilename)
{
HANDLE fh = INVALID_HANDLE_VALUE;
CString str;
str.Format(_T("\\Hard Disk\\Game\\kill\\music\\%s"),lpFilename);
fh = CreateFile(str, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if( fh == INVALID_HANDLE_VALUE )
{
DEBUGMSG(ZONE_ERROR,(TEXT("Error opening \"%s\". Error code = 0x%08x\r\n"), lpFilename, GetLastError() ));
return -1;
}
// Read file and determine sound format
// Start with RIFF header:
unsigned long bytesRead;
if (! ReadFile(fh, &riffHeader, sizeof(riffHeader), &bytesRead, NULL) || bytesRead < sizeof(riffHeader))
{
DEBUGMSG(ZONE_ERROR,(TEXT("Error reading file header\r\n")));
Sleep(1000);
return -1;
}
// Read the rest of the file into a temporary buffer
fileBuffer = (unsigned char *)LocalAlloc( LMEM_FIXED, riffHeader.remainingBytes );
if( fileBuffer == (unsigned char *)NULL )
{
DEBUGMSG(ZONE_ERROR,(TEXT("Error allocating %d bytes\r\n"), riffHeader.remainingBytes ));
Sleep(1000);
return -1;
}
if (! ReadFile(fh, fileBuffer, riffHeader.remainingBytes, &bytesRead, NULL) || bytesRead < riffHeader.remainingBytes)
{
DEBUGMSG(ZONE_ERROR,(TEXT("Error reading file\r\n")));
Sleep(1000);
return -1;
}
CloseHandle(fh);
// Success
return (0);
}
int CMainFrame::ReadWaveHeaderData()
{
// Now walk through the file decoding the chunks
// First, we require a WAVE chunk
pWaveHeader = (SWaveHeader *)fileBuffer;
if( pWaveHeader->WaveCC != waveCC )
{
DEBUGMSG(ZONE_ERROR,(TEXT("Unable to read WAVE chunk\r\n")));
Sleep(1000);
return -1;
}
bufferPtr = fileBuffer + pWaveHeader->ckSize + 2 * sizeof(TFourCC) + 4;
pDataHeader = (SDataHeader *)NULL;
while( bufferPtr > fileBuffer && bufferPtr < fileBuffer + riffHeader.remainingBytes )
{
pMiscHeader = (SMiscHeader *)bufferPtr;
if( pMiscHeader->MiscCC == dataCC )
pDataHeader = (SDataHeader *)pMiscHeader;
bufferPtr += sizeof(SMiscHeader) + pMiscHeader->ckSize;
}
if( !pDataHeader )
{
DEBUGMSG(ZONE_ERROR,(TEXT("Unable to locate data chunk!\r\n")));
Sleep(1000);
return -1;
}
// Success
return (0);
}
LPDIRECTSOUNDBUFFER CMainFrame::SetupDirectSoundBuffer()
{
LPDIRECTSOUNDBUFFER pDSBS;
// Create DirectSoundBuffer
memset( (void *)&dsbdesc, 0, sizeof(dsbdesc) );
dsbdesc.dwSize = sizeof(dsbdesc);
dsbdesc.dwFlags = DSBCAPS_CTRLDEFAULT;
dsbdesc.dwBufferBytes = pDataHeader->dataSize;
dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&(pWaveHeader->pcmwf);
sc=pDS->CreateSoundBuffer( &dsbdesc, &pDSBS, NULL );
// Populate Buffer
pDSBS->Lock( 0, pDataHeader->dataSize, (void **)&dataPtr1, &count1,
(void **)&dataPtr2, &count2, 0 );
memcpy( dataPtr1, (&(pDataHeader->data)), count1 );
// Success
return pDSBS;
}
//建立DirectDraw
void CMainFrame::CreateDirectDraw()
{
//创建DirectX对象
hRet = DirectDrawCreate(NULL, &pDD, NULL);
if(hRet != DD_OK)
{
MessageBox(_T("创建DirectX对象失败!"));
PostMessage(WM_CLOSE);
}
//贴 DirectDraw4 interface
hRet = pDD->QueryInterface(IID_IDirectDraw4, (LPVOID *) & g_pDD);
if(hRet != DD_OK)
{
MessageBox(_T("贴DirectDraw4的表面失败!"));
PostMessage(WM_CLOSE);
}
//设置优先级
hRet = g_pDD->SetCooperativeLevel(m_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT);
if(hRet != DD_OK)
{
MessageBox(_T("设置优先级失败!"));
PostMessage(WM_CLOSE);
}
//创建主缓冲区
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
if(hRet != DD_OK)
{
MessageBox(_T("创建主缓冲区失败!"));
PostMessage(WM_CLOSE);
}
//创建次缓冲区
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
if(hRet != DD_OK)
{
MessageBox(_T("创建次缓冲区失败!"));
PostMessage(WM_CLOSE);
}
}
//建立DirectSound
void CMainFrame::CreateDirectShoud()
{
result = DirectSoundCreate( NULL, &pDS, NULL ); //建立 DirectSound 对象
if(result != DS_OK)
MessageBox(_T("建立 DirectSound 对象失败!"));
/////////////////////////////////////////////////////////////////////////////
memset((void *)&dsbdesc, 0, sizeof(dsbdesc) );
dsbdesc.dwSize = sizeof(dsbdesc);
dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsbdesc.dwBufferBytes = 0;
dsbdesc.lpwfxFormat = NULL;
result=pDS->CreateSoundBuffer( &dsbdesc, &pDSB, NULL );
if(result!=DS_OK)
{
MessageBox(_T("建立主缓冲区失败!"));
}
}
//加载图片
void CMainFrame::LoadBitmap()
{
CBitmap m_back;//背景图片
CBitmap m_mon;//怪物图片
CBitmap m_pig;//飞猪图片
CBitmap m_pigr;
CBitmap m_food1;//食物1图片
CBitmap m_food2;//食物2图片
CBitmap m_food3;//食物3图片
CBitmap m_food4;//食物4图片
CBitmap m_food5;//食物5图片
CBitmap m_boom;//碰撞图片
CBitmap m_blood;//血图片
CBitmap m_heart;//心脏图片
CBitmap m_over;//结束图片
//创建HDC
hdc=::CreateCompatibleDC(NULL);
CBitmap m_loading;//载入图片
//载入
m_loading.LoadBitmap(IDB_LOADING);
Sleep(3000);
::SelectObject(hdc,m_loading);
CreateDDPla(SCREENWIDTH,SCREENHEIGHT,0);
g_pDDSPrimary->Flip( NULL , DDFLIP_WAIT );
//加载背景图片
m_back.LoadBitmap(IDB_BACK);
::SelectObject(hdc,m_back);
CreateDDPla(SCREENWIDTH,SCREENHEIGHT,0);
//加载怪物图片
m_mon.LoadBitmap(IDB_MON);
::SelectObject(hdc,m_mon);
CreateDDPla(MON_WIDTH*8,MON_HEIGHT,1);
//加载飞猪图片
m_pig.LoadBitmap(IDB_PIG);
::SelectObject(hdc,m_pig);
CreateDDPla(PIG_WIDTH*8,PIG_HEIGHT,2);
m_pigr.LoadBitmap(IDB_PIGR);
::SelectObject(hdc,m_pigr);
CreateDDPla(PIG_WIDTH*8,PIG_HEIGHT,3);
//加载食物1图片
m_food1.LoadBitmap(IDB_FOOD1);
::SelectObject(hdc,m_food1);
CreateDDPla(FOOD1_WIDTH*8,FOOD1_HEIGHT,4);
//加载食物2图片
m_food2.LoadBitmap(IDB_FOOD2);
::SelectObject(hdc,m_food2);
CreateDDPla(FOOD2_WIDTH*4,FOOD2_HEIGHT,5);
//加载食物3图片
m_food3.LoadBitmap(IDB_FOOD3);
::SelectObject(hdc,m_food3);
CreateDDPla(FOOD3_WIDTH*3,FOOD3_WIDTH,6);
//加载食物4图片
m_food4.LoadBitmap(IDB_FOOD4);
::SelectObject(hdc,m_food4);
CreateDDPla(FOOD4_WIDTH*7,FOOD4_HEIGHT,7);
//加载食物5图片
m_food5.LoadBitmap(IDB_FOOD5);
::SelectObject(hdc,m_food5);
CreateDDPla(FOOD5_WIDTH*2,FOOD5_HEIGHT,8);
//加载血图片
m_blood.LoadBitmap(IDB_BLOOD);
::SelectObject(hdc,m_blood);
CreateDDPla(BLOOD_WIDTH*8,BLOOD_HEIGHT,9);
//加载结束图片
m_over.LoadBitmap(IDB_OVER);
::SelectObject(hdc,m_over);
CreateDDPla(OVER_WIDTH,OVER_HEIGHT,10);
//加载爆炸图片
m_boom.LoadBitmap(IDB_BOOM);
::SelectObject(hdc,m_boom);
CreateDDPla(BOOM_WIDTH,BOOM_HEIGHT,11);
//加在心脏图片
m_heart.LoadBitmap(IDB_HEART);
::SelectObject(hdc,m_heart);
CreateDDPla(HEART_WIDTH*3,HEART_HEIGHT,12);
}
//建立幕后内存区并加载图档的自定义函式
int CMainFrame::CreateDDPla(int width, int height, int num)
{
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
ddsd.dwWidth = width;
ddsd.dwHeight = height;
hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSOne[num], NULL);
if(hRet !=DD_OK)
{
MessageBox(_T("建立幕后内存区失败!"));
return 0;
}
g_pDDSOne[num]->GetDC(&dhdc); //取得幕后内存区的DC
::BitBlt( dhdc , 0 , 0 ,width, height , hdc , 0 , 0 , SRCCOPY ); //将位图复制到幕后内存区中
g_pDDSOne[num]->ReleaseDC( dhdc ); //释放DC
g_pDDSBack->BltFast(0,0,g_pDDSOne[num],CRect(0,0,width,height),DDBLTFAST_NOCOLORKEY);
return 1;
}
//加载颜色健
void CMainFrame::ColorKey(int num)
{
key.dwColorSpaceHighValue = 0;
key.dwColorSpaceLowValue = 0;
g_pDDSOne[num]->SetColorKey(DDCKEY_SRCBLT,&key);
}
//加载声音
int CMainFrame::LoadSound()
{
int rc;
rc = ReadWaveFileData(_T("\\back.wav"));
rc = ReadWaveHeaderData();
pSBuf[0]= SetupDirectSoundBuffer();
rc = ReadWaveFileData(_T("\\boom.wav"));
rc = ReadWaveHeaderData();
pSBuf[1] = SetupDirectSoundBuffer();
rc = ReadWaveFileData(_T("\\eat.wav"));
rc = ReadWaveHeaderData();
pSBuf[2] = SetupDirectSoundBuffer();
rc = ReadWaveFileData(_T("\\end.wav"));
rc = ReadWaveHeaderData();
pSBuf[3] = SetupDirectSoundBuffer();
rc = ReadWaveFileData(_T("\\level.wav"));
rc = ReadWaveHeaderData();
pSBuf[4] = SetupDirectSoundBuffer();
return rc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -