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

📄 cgame.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if(x<0)
		x=0;
	if(x>=m_pMap->m_head.Width)
		x=m_pMap->m_head.Width-1;
	if(y<0)
		y=0;
	if(y>=m_pMap->m_head.Height)
		y=m_pMap->m_head.Height-1;

	pPlayer->pRole->x=x<<5;
	pPlayer->pRole->y=y<<5;

	m_pPlayer=pPlayer;
	m_pPlayer->pRole->nKinds=0;
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//清除临时角色障碍表
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ClearRoleBlock()
{
	POINT pt;
	while(m_pRoleBlock->Pop(pt))
	{
		m_pMap->m_ppTile[pt.x][pt.y].bCross=true;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//设置角色临时障碍表
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::SetRoleBlock()
{
	m_pRoleBlock->Clear();
	POINT pt;
	
	STRenderRole*pNpc=NULL;

	pt.x=m_pPlayer->pRole->x>>5;
	pt.y=m_pPlayer->pRole->y>>5;

	m_pRoleBlock->Push(pt);
	m_pMap->m_ppTile[pt.x][pt.y].bCross=false;

	if(!m_pPlayer->pRole->bOffsiteOk)							//如果此角色还没有移动到位,就设置当前格子和目的格子作为障碍
	{
		switch(m_pPlayer->pRole->nDirection)
		{
		case LOA_ROLE_DIR_DOWN:
			{
				pt.y++;
				if(pt.y<m_pMap->m_head.Height)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		case LOA_ROLE_DIR_UP:
			{
				pt.y--;
				if(pt.y>=0)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		case LOA_ROLE_DIR_LEFT:
			{
				pt.x--;;
				if(pt.x>=0)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		case LOA_ROLE_DIR_RIGHT:
			{
				pt.x++;
				if(pt.x<m_pMap->m_head.Width)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		}
	}
	DWORD dwTempAddr=m_pNpcList->GetCurAddress();
	m_pNpcList->ResetToHead();
	while(m_pNpcList->GetAndMovePointToNext(pNpc))
	{
		pt.x=pNpc->pRole->x>>5;
		pt.y=pNpc->pRole->y>>5;

		m_pRoleBlock->Push(pt);
		m_pMap->m_ppTile[pt.x][pt.y].bCross=false;

		if(pNpc->pRole->bStandNPC || ( pNpc->pRole->bOffsiteOk))		//如果此NPC不移动或者移动完成了
		{
			continue;
		}
		switch(pNpc->pRole->nDirection)
		{
		case LOA_ROLE_DIR_DOWN:
			{
				pt.y++;
				if(pt.y<m_pMap->m_head.Height)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		case LOA_ROLE_DIR_UP:
			{
				pt.y--;
				if(pt.y>=0)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		case LOA_ROLE_DIR_LEFT:
			{
				pt.x--;;
				if(pt.x>=0)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		case LOA_ROLE_DIR_RIGHT:
			{
				pt.x++;
				if(pt.x<m_pMap->m_head.Width)
				{
					if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
					{
						m_pRoleBlock->Push(pt);
						m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
					}
				}
			}
			break;
		}
	}
	m_pNpcList->SetCurAddress(dwTempAddr);
}
////////////////////////////////////////////////////////////////////////////////////////////
//NPC随机移动
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::NpcRandomMove()
{
	DWORD dwTempAddr=m_pNpcList->GetCurAddress();
	m_pNpcList->ResetToHead();
	STRenderRole*pNpc=NULL;
	while(m_pNpcList->GetAndMovePointToNext(pNpc))
	{
		if(pNpc->pRole->bStandNPC)					//如果此NPC不移动
		{
			pNpc->pRole->MoveAni();
			continue;
		}
		DWORD dwTempAddr=m_pNpcList->GetCurAddress();//保存NPC链表状态
		//如果NPC旬路时间间隔大于设定的时间
		if(timeGetTime()-pNpc->pRole->dwOldPlanTime > pNpc->pRole->dwFindRoadDelay )
		{
			//如果上一次移动还没有完成
			if(!pNpc->pRole->bMoving)
			{
				pNpc->pRole->dwOldPlanTime=timeGetTime();
				int DestX=rand()%(m_pMap->m_head.Width);
				int DestY=rand()%(m_pMap->m_head.Height);
				pNpc->pRole->MoveTo(m_pLog,this,DestX,DestY);
			}
			else	//否则,开始新的旬路
			{
				pNpc->pRole->MoveTo(m_pLog,this,pNpc->pRole->DestPosX,pNpc->pRole->DestPosY);
	
			}
		}
		else
		{
			if(pNpc->pRole->bMoving)
				pNpc->pRole->MoveTo(m_pLog,this,pNpc->pRole->DestPosX,pNpc->pRole->DestPosY);
			else
				pNpc->pRole->MoveAni();
		}
		//恢复NPC链表状态
		m_pNpcList->SetCurAddress(dwTempAddr);
	}
	m_pNpcList->SetCurAddress(dwTempAddr);
}
////////////////////////////////////////////////////////////////////////////////////////////
//退出游戏
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::QuitGame(int ExitCode)
{
	PostMessage(m_hWnd,WM_DESTROY,0,0);
}
////////////////////////////////////////////////////////////////////////////////////////////
//播放媒体
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::PlayMedia(char*szFile,BOOL bLoop,BOOL bWait,BOOL bBreakIfPressKey)
{
	LOA_ASSERT(szFile!=NULL);

	m_pDShow->StopAndRelease();
	delete m_pDShow;
	m_pDShow=KGDShow::KGDShowCreate();
	if(!m_pDShow->LoadMedia(szFile))
		return false;
	char strTemp[128];
	strcpy(strTemp,szFile);
	strcpy(this->m_szCurrentMusicFile,strTemp);									//为防止szFile等于自身
	m_pDShow->Play(m_hWnd,bLoop);
	if(bWait)
	{
		WaitMediaPlayOK(bBreakIfPressKey);
	}
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//暂停
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::PauseMedia()
{
	return m_pDShow->Pause();
}
////////////////////////////////////////////////////////////////////////////////////////////
//恢复
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::ResumeMedia()
{
	return m_pDShow->Continue();
}
////////////////////////////////////////////////////////////////////////////////////////////
//等待媒体播放完成(同步)
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::WaitMediaPlayOK(BOOL bBreakIfPressKey)
{
	MSG msg;

	while(m_bPlayGame)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL,0,0)) 
				return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(m_bActive)
		{
			if(bBreakIfPressKey)
			{
				BYTE key=m_pKeyBoard->ReadLastBufferKey();
				if(key==DIK_ESCAPE || key==DIK_RETURN)
				{
					m_pDShow->StopAndRelease();
					break;
				}
			}
			if(!m_pDShow->IsPlaying())
			{	
				break;
			}
		}
		else
			WaitMessage();
	}
	::UpdateWindow(m_hWnd);
 	::SetForegroundWindow(m_hWnd);
	::SetFocus(m_hWnd);

	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//锁定游戏速度
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::LockFPS()
{
	//-------------------------------------------------------------------//
	static DWORD odt=timeGetTime();
	while(timeGetTime()-odt<30)											//锁定fps为30
		;
	odt=timeGetTime();
	//------------------------------------------------------------------//
}
////////////////////////////////////////////////////////////////////////////////////////////
//延时
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::Delay(DWORD dwDelay)
{
	DWORD dwOldTime=timeGetTime();
	
	MSG msg;
 
	while(m_bPlayGame)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL,0,0)) 
				return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(m_bActive)
		{
			if(timeGetTime()-dwOldTime > dwDelay)
				break;
			SortAndShowRole();
			UpdateScreen();
		}
		else
			WaitMessage();
	}
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//显示一幅JPG图片,附带文字说明(比如游戏开头动画),如果szJPEG=NULL就不用图片
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::ShowStaticPictureWithMessage(char*szJPEG,char*str)
{
	LOA_ASSERT(str);
	LOA_ASSERT(szJPEG);

	CSurface*pTemp=NULL;
	
	FadeIn();
	
	if(strcmp(szJPEG,"NULL")==0)
	{
		if(FAILED(m_pDisplay->CreateSurface(&pTemp,640,480)))
			return false;
		pTemp->Clear();
	}
	else
	{
		if(FAILED(m_pDisplay->CreateSurfaceFromJPEG(&pTemp,szJPEG)))
			return false;
	}
	//添加一个渲染任务
	CRenderPicture*pRenderPic=new CRenderPicture;
	pRenderPic->InitRender(m_pDisplay,pTemp);
	pRenderPic->CreateTask();

	m_pRender->AddTask(pRenderPic);
	m_pDisplay->Clear();
	m_pDisplay->Blt(0,0,pTemp);
	FadeInRestore();

	//显示文字
	CTalk talk;
	talk.ShowMessage(this,str,180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	
	pRenderPic->EndTask();
	delete pTemp;
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//LOGO循环
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::LogoLoop()
{
	PlayMedia( "music\\title.wma",false);
	LoadMap("map\\null.lmp");
 
	CSurface*pTemp=NULL;
	
	FadeIn();

	if(FAILED(m_pDisplay->CreateSurfaceFromJPEG(&pTemp,"pic\\title\\sea.jpg")))
		return false;
	CRenderPicture*pRenderPic=new CRenderPicture;
	pRenderPic->InitRender(m_pDisplay,pTemp);
	pRenderPic->CreateTask();

	m_pRender->AddTask(pRenderPic);

	m_pDisplay->Clear();
	m_pDisplay->Blt(0,0,pTemp);
	FadeInRestore();
	CTalk talk;
	BYTE key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	
	talk.ShowMessage(this,"    在一片广阔的蓝色海洋上,海鸟们自由的飞翔着……               ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"在大海中央,有一块大陆,绿阴葱葱。              ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	FadeIn();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	pTemp->DrawJPEG("pic\\title\\sea2.jpg");
	m_pDisplay->Clear();
	m_pDisplay->Blt(0,0,pTemp);
	FadeInRestore();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"这块大陆,叫做亚特兰蒂斯大陆……               ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"繁荣的大陆上,人们与大自然和睦相处,和平地生活着……                  ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	FadeIn();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	pTemp->DrawJPEG("pic\\title\\battle.jpg");
	m_pDisplay->Clear();
	m_pDisplay->Blt(0,0,pTemp);
	FadeInRestore();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"然而……              ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"突然有一天,这个大陆上雷电交加,战云密布……                  ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"黑暗王国的战士们,突然闯进了这块和平的大陆,和大陆上的人们展开了激烈的争斗……                  ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"由于长期的爱好和平,这个大陆上的人们早就忘记了战争的存在……                  ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	talk.ShowMessage(this,"对于突发的战争,人们完全没有来得及应付……                  ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	FadeIn();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	pTemp->DrawJPEG("pic\\title\\title5.jpg");
	m_pDisplay->Clear();
	m_pDisplay->Blt(0,0,pTemp);
	FadeInRestore();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -