⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 Windows CE 下Kill 游戏的源代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				{
					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 + -