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

📄 cgame.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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->Clear();
	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;
	FadeIn();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	pTemp->DrawJPEG("pic\\title\\destroy.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;
	Delay(2000);

	FadeIn();
	key=m_pKeyBoard->ReadLastBufferKey(50);
	if(key==DIK_ESCAPE)
		goto _end;
	pTemp->DrawJPEG("pic\\title\\dead.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;
	Delay(2000);
_end:
	FadeOut();
	pRenderPic->EndTask();
	delete pTemp;
//*/
	//读取开始地图
	LoadMap("map\\sea.lmp");
	m_nCurrentGameState=LOA_GAME_STATE_NORMAL;
	
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////
//从文件中读取角色
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::LoadRole(char *szFile,char*szSection,STRenderRole **ppRole)
{
	LOA_ASSERT(ppRole!=NULL);
	LOA_ASSERT(szFile!=NULL);
	
	(*ppRole)=new STRenderRole;
	(*ppRole)->pRole=new CRole();


	if(!m_pGameData->LoadRoleFromIni(szFile,szSection,(*ppRole)->pRole))
		return false;
	return m_pRoleGraph->GetRoleGraph((*ppRole)->pRole,&(*ppRole)->pGraph);
}
////////////////////////////////////////////////////////////////////////////////////////////
//将屏幕滚到以玩家为中心的地方
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ScrollScreenToPlayer()
{
	if(!m_pPlayer)
		return;
	ScrollScreenTo((m_pPlayer->pRole->x-320)>>5,(m_pPlayer->pRole->y-224)>>5);
}
////////////////////////////////////////////////////////////////////////////////////////////
//将屏幕滚到以id为ID的NPC为中心的地方
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ScrollScreenToNpc(int ID)
{
	STRenderRole*pNpc=NULL;
	if(m_pNpcList->FindData(ID,pNpc))
	{
		ScrollScreenTo((pNpc->pRole->x-320)>>5,(pNpc->pRole->y-224)>>5);
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//将屏幕滚到图块坐标为TileX,TileY的地方
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ScrollScreenTo(int TileX,int TileY)
{
	MSG msg;
	
	int NowX=m_pRenderMap->m_xStart;
	int NowY=m_pRenderMap->m_yStart;
	
	if(TileY>=m_pMap->m_head.Height-15)
		TileY=m_pMap->m_head.Height-16;
	if(TileY<0)
		TileY=0;
	if(TileX>=m_pMap->m_head.Width-20)
		TileX=m_pMap->m_head.Width-21;
	if(TileX<0)
		TileX=0;
	
	

	int EndX=TileX<<5;
	int EndY=TileY<<5;
	while(m_bPlayGame)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL,0,0)) 
				return;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(m_bActive)
		{
			if(NowX==EndX && NowY==EndY)
				break;
			m_pMsg->ExecuteMessage();										//执行消息队列中的消息
			//------------------------------------------------------------------//
			//------------------------------------------------------------------//
			NpcRandomMove();												//npc随机移动
			//------------------------------------------------------------------//
			
			//------------------------------------------------------------------//
		 	SortAndShowRole();

			if(NowX!=EndX)
			{
				if(NowX<EndX)
				{
					NowX+=6;
					if(NowX>EndX)
						NowX=EndX;
				}
				else
				{
					NowX-=6;
					if(NowX<EndX)
						NowX=EndX;
				}
			}
			if(NowY!=EndY)
			{
				if(NowY<EndY)
				{
					NowY+=6;
					if(NowY>EndY)
						NowY=EndY;
				}
				else
				{
					NowY-=6;
					if(NowY<EndY)
						NowY=EndY;
				}
			}
			m_pRenderMap->m_xStart=NowX;
			m_pRenderMap->m_yStart=NowY;
			UpdateScreen();
		}
		else
			WaitMessage();
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//对NPC按Y坐标进行排序
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::SortAndShowRole()
{
	if(!m_pPlayer)
		return;
	STRenderRole*pNpc=NULL;
	DWORD dwTempAddr=m_pNpcList->GetCurAddress();
	m_pNpcList->ResetToHead();
	m_pRoleQueue->Clear();
	while(m_pNpcList->GetAndMovePointToNext(pNpc))
	{
		m_pRoleQueue->EnQueue(pNpc,pNpc->pRole->y);
	}	
	m_pNpcList->SetCurAddress(dwTempAddr);

	m_pRoleQueue->EnQueue(m_pPlayer,m_pPlayer->pRole->y);			//按照角色Y轴坐标大小从新排序,保证上面的角色被下面的角色遮挡
	

	m_pRenderRole=new CRenderRole();
	m_pRenderRole->CreateTask(true,true,8);							//创建一个自动释放的任务

	m_pRenderRole->InitRender(m_pDisplay,m_pMap,m_pMapSurface,m_pRenderMap,m_pRoleQueue);//更新渲染队列
	m_pRender->AddTask(m_pRenderRole);								//添加任务

}
////////////////////////////////////////////////////////////////////////////////////////////
//计算屏幕上该从何处显示地图
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ComputeMapStartPos()
{
	if(!m_pMapRole)
		return;
	m_pRenderMap->m_yStart=m_pMapRole->pRole->y-224;
	m_pRenderMap->m_xStart=m_pMapRole->pRole->x-320;



	if((int)m_pRenderMap->m_yStart<0)
		m_pRenderMap->m_yStart=0;
	if(m_pRenderMap->m_yStart > (DWORD)(m_pMap->m_head.Height<<5)-480)
		m_pRenderMap->m_yStart=(m_pMap->m_head.Height<<5)-480;
	if((int)m_pRenderMap->m_xStart<0)
		m_pRenderMap->m_xStart=0;
	if(m_pRenderMap->m_xStart >(DWORD)(m_pMap->m_head.Width<<5)-640)
		m_pRenderMap->m_xStart =(DWORD)(m_pMap->m_head.Width<<5)-640;
	if(m_bDitherScreen)
	{
		m_pRenderMap->m_yStart+=rand()%10;
		m_pRenderMap->m_xStart+=rand()%10;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//显示开始菜单
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::ShowBeginMenu()
{
	SetDay();
	PlayMedia("music\\begin.wma");

	//创建临时表面
	CSurface*pSurfTemp=NULL;
	if(FAILED(m_pDisplay->CreateSurfaceFromJPEG(&pSurfTemp,"pic\\system\\title.jpg")))
		return false;
	
	m_pDisplay->Clear();
	m_pDisplay->Blt(0,0,pSurfTemp);
	
	FadeInRestore();
	
	CSurface*pSurfText=NULL;
	if(FAILED(m_pDisplay->CreateSurface(&pSurfText,640,480)))
		return false;

	pSurfText->SetColorKey(0);

	CIcon icon;
	icon.InitIcon(m_pDisplay,LOA_ICON_ARROW);

	CFont font;

	int nCurrentSelect=0;
	int nBlue=0;
	int kBlue=1;
	int kGreen=-1;
	int nGreen=1;
	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)
		{
			BYTE key=m_pKeyBoard->ReadLastBufferKey(50);
			switch(key)
			{
			case DIK_UP:
				{
					if(m_pKeyBoard->WaitKey(DIK_UP,150))
					{
						nCurrentSelect--;
						if(nCurrentSelect<0)
							nCurrentSelect=2;
					}
				}
				break;
			case DIK_DOWN:
				{
					if(m_pKeyBoard->WaitKey(DIK_DOWN,150))
					{
						nCurrentSelect++;
						if(nCurrentSelect>2)
							nCurrentSelect=0;
					}
				}
				break;	
			case DIK_RETURN:
				{
					if(m_pKeyBoard->WaitKey(DIK_RETURN,150))
					{
						switch(nCurrentSelect)
						{
						case 0:
							{
								delete pSurfText;
								delete pSurfTemp;
								m_nCurrentGameState=LOA_GAME_STATE_CREDITS;
								return 1;
							}
							break;
						case 1:
							{
								
								CGameMenu menu;
								if(-1==menu.MenuLoop(this,LOA_MENU_STYLE_SHOW_LOAD))
								{
									delete pSurfText;
									delete pSurfTemp;
									m_nCurrentGameState=LOA_GAME_STATE_NORMAL;
									return LoadGame(this->m_nCurrentSaveFileIndex);
								}
							}
							break;
						case 2:
							{
								PostMessage(m_hWnd,WM_CLOSE,0,0);
							}
							break;
						}
					}
				}
				break;
			}
			m_pDisplay->Clear();
			m_pDisplay->Blt(0,0,pSurfTemp);
			pSurfText->Clear();
			
			nGreen+=kGreen;
			if(nGreen>254)
			{	
				kGreen=-kGreen;
			}
			else if(nGreen<1)
			{
				kGreen=-kGreen;
			}
			nBlue+=kBlue;
			if(nBlue>254)
			{	
				kBlue=-kBlue;
			}
			else if(nBlue<1)
			{
				kBlue=-kBlue;
			}
			font.CreateFont(80,600,true);			
			pSurfText->DrawText(font.GetFont(),"亚特兰蒂斯传奇",30,80,0,RGB(255,nGreen,nBlue));
			font.CreateFont();
			pSurfText->DrawText(font.GetFont(),"Game++ Studio,Kylinx 2003-6-16/2003-8-9",300,160,0,RGB(255,0,0));
			font.CreateFont(30);
			switch(nCurrentSelect)
			{
			case 0:
				{
					pSurfText->DrawText(font.GetFont(),"新的故事",280,200,0,RGB(0,0,255));
					pSurfText->DrawText(font.GetFont(),"旧的历程",280,280,0,RGB(255,255,255));
					pSurfText->DrawText(font.GetFont(),"回到现实",280,360,0,RGB(255,255,255));
					icon.Show(260,200);
				}
				break;
			case 1:
				{
					pSurfText->DrawText(font.GetFont(),"新的故事",280,200,0,RGB(255,255,255));
					pSurfText->DrawText(font.GetFont(),"旧的历程",280,280,0,RGB(0,0,255));
					pSurfText->DrawText(font.GetFont(),"回到现实",280,360,0,RGB(255,255,255));
					icon.Show(260,280);
				}
				break;
			case 2:
				{
					pSurfText->DrawText(font.GetFont(),"新的故事",280,200,0,RGB(255,255,255));
					pSurfText->DrawText(font.GetFont(),"旧的历程",280,280,0,RGB(255,255,255));
					pSurfText->DrawText(font.GetFont(),"回到现实",280,360,0,RGB(0,0,255));
					icon.Show(260,360);
				}
				break;
			}
			m_pDisplay->ColorKeyBlt(0,0,pSurfText->GetDDrawSurface());
			m_pDisplay->Present();
		}
		else 
			WaitMessage();
	}

	delete pSurfText;
	delete pSurfTemp;

	return 1;

}
////////////////////////////////////////////////////////////////////////////////////////////
//产生一个随机敌人
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::RandomEnemy(CRole*pRole)
{
	LOA_ASSERT(pRole);
	if(m_pPlayer->pRole->Level==0)
		m_pPlayer->pRole->Level=1;
	pRole->Level=m_pPlayer->pRole->Level/2+rand()%m_pPlayer->pRole->Level;
	if(pRole->Level==0)
		pRole->Level=1;
	pRole->Attack=m_pPlayer->pRole->Attack/3+pRole->Level*(rand()%m_pPlayer->pRole->Level);
	pRole->Defend=m_pPlayer->pRole->Defend/3+rand()%pRole->Level;
	
	pRole->Hp=m_pPlayer->pRole->MaxHp/2+pRole->Level*(rand()%pRole->Level);
	pRole->Mp=m_pPlayer->pRole->MaxMp/2+pRole->Level*(rand()%pRole->Level);
	pRole->Exp=(rand()%m_pPlayer->pRole->Level)*5+10;
	pRole->Money=(rand()%m_pPlayer->pRole->Level)*30+30;
	pRole->MaxHp=pRole->Hp;
	pRole->MaxMp=pRole->Mp;
	pRole->MaxExp=pRole->Exp;
	pRole->GoodsNum=0;
	pRole->MagicNum=0;
	switch(rand()%6)
	{
	case 0:
	case 1:
	case 2:
		pRole->Kidney=LOA_KIDNEY_ATTACK;
		break;
	case 3:
		pRole->Kidney=LOA_KIDNEY_DEFEND;
		pRole->AddMagic(101);
		pRole->AddMagic(102);
		pRole->AddMagic(105);
		pRole->AddGoods(100);
		pRole->AddGoods(101);
		pRole->AddGoods(101);
		break;
	case 4:
		pRole->Kidney=LOA_KIDNEY_MAGIC;
		pRole->AddMagic(101);
		pRole->AddMagic(102);
		pRole->AddMagic(103);
		pRole->AddMagic(105);
		pRole->AddMagic(107);
		break;
	case 5:
		pRole->Kidney=LOA_KIDNEY_ESCAPE;
		break;
	}
	int rnd1=(rand()%7)+1;
	switch(rnd1)
	{
	case 1:
		strcpy(pRole->szName,"大卫");
		break;
	case 2:
		strcpy(pRole->szName,"申吟");
		break;
	case 3:
		strcpy(pRole->szName,"丁茶叶");
		break;
	case 4:
		strcpy(pRole->szName,"黄一马");
		break;
	case 5:
		strcpy(pRole->szName,"咪咪");
		break;
	case 6:
		strcpy(pRole->szName,"肾虚");
		break;

⌨️ 快捷键说明

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