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

📄 gscene.cpp

📁 RPG游戏源代码,里面有RPG游戏的制作流程,供大家学习如何制作RPG游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				if(m_RoleArray[roleidx]->GetLevel()!=Level) break;
				m_RoleArray[roleidx]->RenderRole();
			}

		//渲染第Level+1层景物
		m_gSceneLayers[Level+1].RenderLayer(m_gGraph,XOff,YOff);	
	}
	
	GAFDDraw.GetBack()->TextXY(10,30,0xffffff,m_szName);
	
	//显示主角状态
	RenderLeaderStatus();
	
	return S_OK;
}

HRESULT CGScene::ProcessScene()
{
	assert(m_pGameApp);

	while(m_pGameApp->GAFGameStatus == GAF_GAMESTATUS_INSCENE)
	{
		if(GAFAppProcessMessage()==FALSE)	return E_FAIL;
		
		//更新角色状态
		GAFDInput.Update(TRUE,TRUE);
		for(int i=0;i<CG_NUM_MAXROLEINSCENE;++i)
		{
			if(m_RoleArray[i])	m_RoleArray[i]->AIThinking();
		}
		
		//渲染场景
		RenderScene();
		GAFDDraw.Present(FALSE,TRUE);
		
		//按下ESC退出程式
		if(GAFDInput.GetKeyState(DIK_ESCAPE)==GAFDIKEY_RELEASE) break;
	
		//检测事件触发
		SHORT leaderidx=GetLeaderRoleIndex();
		if(GAFDInput.GetMouseKeyState(DIK_MOUSELEFT)==GAFDIKEY_RELEASE)
		{
			LONG lX,lY;
			GAFDInput.GetSysMousePos(&lX,&lY);
			AdjustMousePosition(&lX,&lY);
			
			//检测是否点击了某个角色
			int RolIdx;
			for(RolIdx=RoleCount-1;RolIdx>=0;RolIdx--)
			{
				if(m_RoleArray[RolIdx])	
					if(m_RoleArray[RolIdx]->CheckMouseHit(lX,lY)) break;
			}
						
			if(RolIdx>=0 && RolIdx!=leaderidx)	//如果是非主角就运行脚本
			{
				HRESULT hr = RunScript(m_RoleArray[RolIdx]->GetScriptFileName());
				TESTHR_RET(hr);
			}
			if(RolIdx>=0 && RolIdx==leaderidx)	//如果是主角就打开道具选择框
			{
				while(TRUE)
				{
					if(GAFAppProcessMessage()==FALSE)	return E_FAIL;
					
					RenderScene();
					m_gObjManager.RenderOBJList();
					GAFDDraw.Present(FALSE,TRUE);
								
					HRESULT hr = m_gObjManager.ProcessOBJList();
					TESTHR_RET(hr);
					if(hr==S_OK) break;	//道具使用完毕
				}
			}
		}
		
		//检测出口触发
		SHORT exitidx=CheckEnterExit();
		if(exitidx!=-1)
		{
			LONG STX=m_ExitArray[exitidx].TX;
			LONG STY=m_ExitArray[exitidx].TY;

			HRESULT hr=LoadScene(m_ExitArray[exitidx].TargetScene);
			if(leaderidx!=-1)	
				m_RoleArray[leaderidx]->SetMapPos(STX,STY);
			
			TESTHR_MSGRET(hr,"RPGDEMO装载场景出错,程式终止!");
		}
	}

	m_pGameApp->GAFGameStatus = GAF_GAMESTATUS_MAINTITLE;
	
	return S_OK;
}

SHORT CGScene::GetLevel(LONG mx,LONG my) const	//检测(mx,my)坐标的层次信息
{
	assert(m_pMapInfo);
	assert(mx>=0&&mx<Width);
	assert(my>=0&&my<Height);
		
	MapToCell(mx,my);

	WORD Level=m_pMapInfo[my*HCells+mx]>>8;
	return Level&0xfffe;
}

BOOL CGScene::CanWalk(LONG mx, LONG my, LPCGRole sender) const	//检测sender角色是否可以走到(mx,my)坐标
{
	assert(sender);
	assert(m_pMapInfo);

	if(mx<0||mx>=Width||my<0||my>=Height) return FALSE;
	
	LONG cx=mx,cy=my;
	MapToCell(cx,cy);
	
	if(m_pMapInfo[cy*HCells+cx]&0x0001) return FALSE;

	int x2,y2,dx,dy;
	for(int i=0;i<CG_NUM_MAXROLEINSCENE;i++)
	{
		if(m_RoleArray[i] && m_RoleArray[i]!=sender)
		{
			m_RoleArray[i]->GetMapPos(x2,y2);
			dx=mx-x2;dy=my-y2;
			if(dx*dx+dy*dy<16*16)	return FALSE;
		}
	}

	return TRUE;
}

void CGScene::SetScenePosition(int nx, int ny)
{
	XPosition = nx;
	YPosition = ny;
	if(XPosition<0) XPosition=0;
	if(YPosition<0) YPosition=0;
	if(XPosition>(int)Width-(int)ScreenWidth)	XPosition=(int)Width-(int)ScreenWidth;
	if(YPosition>(int)Height-(int)ScreenHeight)	YPosition=(int)Height-(int)ScreenHeight;
}

void CGScene::FocusSceneCenter(int cx, int cy)
{
	LONG sx=(LONG)(ScreenWidth/2);
	LONG sy=(LONG)(ScreenHeight/2);
	SetScenePosition(cx-sx,cy-sy);
}

SHORT CGScene::AddNewRole(LPCTSTR szFileName,int rXM,int rYM, SHORT rDirection) 	//增加新的角色
{
	if(RoleCount+1>=CG_NUM_MAXROLEINSCENE)	return -1;
	
	CGRole* NewRole = new CGRole(this);
	if(NewRole==NULL) return -1;
	if(FAILED(NewRole->LoadRole(szFileName)))
	{
		SAFEDELETE(NewRole);
		return -1;
	}
	
	NewRole->SetDirection(rDirection);
	NewRole->SetMapPos(rXM,rYM);

	for(int i=0;i<CG_NUM_MAXROLEINSCENE;i++)
		if(m_RoleArray[i]==NULL) break;
	
	if(i<CG_NUM_MAXROLEINSCENE)	
		m_RoleArray[i] = NewRole;
	else
	{
		SAFEDELETE(NewRole);
		return -1;
	}

	RoleCount++;
	return i;
}

SHORT CGScene::GetLeaderRoleIndex() const			//获取场景主控主角
{
	SHORT idx;
	for(idx=CG_NUM_MAXROLEINSCENE-1;idx>=0;--idx)
	{
		if(m_RoleArray[idx])
			if(m_RoleArray[idx]->GetFlag()==ROLEFLAG_LEADER) break;
	}
	return idx;
}

SHORT CGScene::GetRoleIndex(const LPCTSTR szName) const	//获取名称对应的角色的索引
{
	assert(szName);
	string RoleName=szName;

	SHORT idx;
	for(idx=CG_NUM_MAXROLEINSCENE-1;idx>=0;--idx)
	{
		if(m_RoleArray[idx])
			if(RoleName == m_RoleArray[idx]->GetRoleName())
				break;
	}
	return idx;
}

void CGScene::ClearupROLEArray(BOOL bClearAllRole)
{
	RoleCount = 0;
	for(int i=0;i<CG_NUM_MAXROLEINSCENE;++i)
		if(m_RoleArray[i])
		{
			if(m_RoleArray[i]->GetFlag()==ROLEFLAG_LEADER)	//场景切换的时候不清除主角
			{
				++RoleCount;
				if(bClearAllRole) SAFEDELETE(m_RoleArray[i]);
			}
			else SAFEDELETE(m_RoleArray[i]);
		}
	if(bClearAllRole)	RoleCount = 0;
}

HRESULT CGScene::InitNewGame()
{
	HRESULT hr;

	hr = LoadScene("Valley.SCN");
	TESTHR_MSGRET(hr,"装载Valley场景出错");
	
	hr = AddNewRole("LeaderHero.ROL",40,400,7);
	TESTHR_MSGRET(hr,"装载主角出错");
		
	hr = m_gObjManager.InitObjectList(this);
	TESTHR_MSGRET(hr,"初始化道具管理器出错");

	hr = m_gObjManager.AddItem("医疗箱",5);
	TESTHR_MSGRET(hr,"添加化道具出错");
	
	hr = m_gObjManager.AddItem("魔力草药",2);
	TESTHR_MSGRET(hr,"添加化道具出错");
	
	hr = m_gFightMenuManager.InitFightMenu(this);
	TESTHR_MSGRET(hr,"战斗菜单初始化错误");

	return S_OK;
}

SHORT CGScene::CheckEnterExit()
{
	SHORT leaderidx=GetLeaderRoleIndex();
	if(leaderidx==-1) return -1;

	int lx,ly;
	m_RoleArray[leaderidx]->GetMapPos(lx,ly);
	POINT pt; pt.x=lx; pt.y=ly;
	
	for(SHORT exitidx=ExitCount-1;exitidx>=0;exitidx--)
	{
		if(m_ExitArray[exitidx].Enable
			&& PtInRect(&(m_ExitArray[exitidx].rt),pt))
			break;
	}
			
	return exitidx;
}

HRESULT CGScene::MsgBox(const LPCTSTR Captain, const LPCTSTR Msg)
{
	assert(m_pGameApp);
	assert(Captain);
	assert(Msg);

	while(TRUE)	
	{
		if(GAFAppProcessMessage()==FALSE)	return E_FAIL;

		//渲染场景
		RenderScene();

		//画一个对话框
		//未完成

		//DEBUG
		GAFDDraw.GetBack()->TextXY(100,100,0xFFFF,Captain);
		GAFDDraw.GetBack()->TextXY(100,120,0xFFFF,Msg);
		GAFDDraw.GetBack()->TextXY(100,160,0xFFFFFF,"点击鼠标左键或者按ESC返回场景...");
		GAFDDraw.Present(FALSE,TRUE);
		//DEBUG

		//输入控制
		GAFDInput.Update(TRUE,TRUE);
		if(GAFDInput.GetKeyState(DIK_ESCAPE)==GAFDIKEY_RELEASE
			||GAFDInput.GetKeyState(DIK_SPACE)==GAFDIKEY_RELEASE
			||GAFDInput.GetMouseKeyState(DIK_MOUSELEFT)==GAFDIKEY_RELEASE)
		{
			break;
		}
	}
	
	return S_OK;
}

void CGScene::RenderLeaderStatus()
{
	LPCGRole pLeaderRole=GetRole(GetLeaderRoleIndex());
	assert(pLeaderRole);
	static CHAR StatStr[256];
	
	strncpy(StatStr,"HP = ",99);
	itoa(pLeaderRole->GetHP(),StatStr+5,10);
	strncat(StatStr,"/",99);
	itoa(pLeaderRole->GetHP_MAX(),StatStr+strlen(StatStr),10);
	GAFDDraw.GetBack()->TextXY(10,420,0xffffff,StatStr);

	strncpy(StatStr,"MP = ",99);
	itoa(pLeaderRole->GetMP(),StatStr+5,10);
	strncat(StatStr,"/",99);
	itoa(pLeaderRole->GetMP_MAX(),StatStr+strlen(StatStr),10);
	GAFDDraw.GetBack()->TextXY(10,438,0xffffff,StatStr);
	
	strncpy(StatStr,"AP=",99);
	itoa(pLeaderRole->GetEAP(),StatStr+3,10);
	strncat(StatStr," / DP=",99);
	itoa(pLeaderRole->GetEDP(),StatStr+strlen(StatStr),10);
	GAFDDraw.GetBack()->TextXY(10,456,0xffffff,StatStr);
}

//***浪人添加*/
void CGScene::RenderBossStatus(LPCGRole pBossRole)
{
	assert(pBossRole);
	static CHAR StatStr[256];
	
	strncpy(StatStr,"HP = ",99);
	itoa(pBossRole->GetHP(),StatStr+5,10);
	strncat(StatStr,"/",99);
	itoa(pBossRole->GetHP_MAX(),StatStr+strlen(StatStr),10);
	GAFDDraw.GetBack()->TextXY(10,30,0xffffff,StatStr);
	
	strncpy(StatStr,"MP = ",99);
	itoa(pBossRole->GetMP(),StatStr+5,10);
	strncat(StatStr,"/",99);
	itoa(pBossRole->GetMP_MAX(),StatStr+strlen(StatStr),10);
	GAFDDraw.GetBack()->TextXY(10,48,0xffffff,StatStr);
	
	strncpy(StatStr,"AP=",99);
	itoa(pBossRole->GetEAP(),StatStr+3,10);
	strncat(StatStr," / DP=",99);
	itoa(pBossRole->GetEDP(),StatStr+strlen(StatStr),10);
	GAFDDraw.GetBack()->TextXY(10,66,0xffffff,StatStr);
}

⌨️ 快捷键说明

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