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

📄 interactivelayer.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				{
					pTerrainObj->LoadData(fp);
					this->AddMapObj(pTerrainObj);
				}
			}
			break;
		case MAP_SOUND:
			{
				CMapSound* pObj = new CMapSound;
				if(pObj)
				{
					pObj->LoadDataObj(fp);
					this->AddMapObj(pObj);
					//pObj->Play();
				}
			}
			break;
		case MAP_3DEFFECT:
			{
				C3DMapEffect* pEffect = new C3DMapEffect;
				if(pEffect)
				{
					pEffect->LoadDataObj(fp);
					this->AddMapObj(pEffect);
				}
			}
			break;
		case MAP_3DEFFECTNEW:
			{
				C3DMapEffectNew* pEffect = new C3DMapEffectNew;
				if(pEffect)
				{
					pEffect->LoadDataObj(fp);
					this->AddMapObj(pEffect);
				}
			}
			break;
		default:
			break;
		}
	}
	
	
}
//-------------------------------------------------------------
void CInteractiveLayer::LoadTextLayer(FILE* fp)
{
	if(!fp)
		return;
	int nAmount;
	fscanf(fp, "========InteractiveLayer ObjAmount=%d========\n", &nAmount);
	for(int i = 0; i < nAmount; i++)
	{
		int nObjType;
		fscanf(fp, "========ObjType=%d========\n", &nObjType);
		switch(nObjType)
		{
		case MAP_COVER:
			{
				C2DMapCoverObj* pCoverObj = new C2DMapCoverObj;
				if(pCoverObj)
				{
					pCoverObj->LoadTextObj(fp);
					this->AddMapObj(pCoverObj);
				}
			}
			break;
		case MAP_TERRAIN:
			{
				C2DMapTerrainObj* pTerrainObj = new C2DMapTerrainObj;
				if(pTerrainObj)
				{
					pTerrainObj->LoadText(fp);
					this->AddMapObj(pTerrainObj);
					this->PlaceTerrainObj(pTerrainObj);
				}
			}
			break;
		case MAP_SOUND:
			{
				CMapSound* pSound = new CMapSound;
				if(pSound)
				{
					pSound->LoadTextObj(fp);
					this->AddMapObj(pSound);
					pSound->Play();
				}
			}
			break;
		case MAP_3DEFFECT:
			{
				C3DMapEffect* pEffect = new C3DMapEffect;
				if(pEffect)
				{
					pEffect->LoadTextObj(fp);
					this->AddMapObj(pEffect);
				}
			}
			break;
		case MAP_3DEFFECTNEW:
			{
				C3DMapEffectNew* pEffect = new C3DMapEffectNew;
				if(pEffect)
				{
					pEffect->LoadTextObj(fp);
					this->AddMapObj(pEffect);
				}
			}
			break;
		default:
			break;
		}
	}
}
//-------------------------------------------------------------
CMapSound* CInteractiveLayer::GetFocusSound()
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i++)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(!pObj)
			continue;
		if(pObj->GetObjType() == MAP_SOUND)
		{
			CMapSound* pMyObj = (CMapSound*)pObj;
			if(pMyObj->IsFocus())
				return pMyObj;
		}
	}
	return NULL;
}
//-------------------------------------------------------------
C2DMapCoverObj* CInteractiveLayer::Get2DFocusMapCoverObj()
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i++)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(!pObj)
			continue;
		if(pObj->GetObjType() == MAP_COVER)
		{
			C2DMapCoverObj* p2DMapCoverObj = (C2DMapCoverObj*)pObj;
			if(p2DMapCoverObj->IsFocus())
				return p2DMapCoverObj;
		}
	}
	return NULL;
}
//-------------------------------------------------------------
C2DMapTerrainObj* CInteractiveLayer::Get2DFocusMapTerrainObj()
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i++)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(!pObj)
			continue;
		if(pObj->GetObjType() == MAP_TERRAIN)
		{
			C2DMapTerrainObj* p2DMapTerrainObj = (C2DMapTerrainObj*)pObj;
			if(p2DMapTerrainObj->IsFocus())
				return p2DMapTerrainObj;
		}
	}
	return NULL;
	
}
//-------------------------------------------------------------
C2DMapTerrainObjPart*  CInteractiveLayer::Get2DFocusMapTerrainObjPart()
{
	DEQUE_MAPOBJ setPartObj;
	setPartObj.clear();
	int nAmount = m_setMapObj.size();
	// 建立要测试队列
	for(int k = 0; k < nAmount; k++)
	{
		CMapObj* pObj = m_setMapObj[k];
		if(pObj && pObj->GetObjType() == MAP_TERRAIN)
		{
			C2DMapTerrainObj* pTerrainObj = (C2DMapTerrainObj*)pObj;
			int nPartAmount = pTerrainObj->GetPartAmount();
			for(int l = 0; l < nPartAmount; l++)
			{
				C2DMapTerrainObjPart* pPart = pTerrainObj->GetPartByIndex(l);	
				if(pPart)
				{
					CMyPos posPart;
					pPart->GetPos(posPart);
					if(g_objGameMap.IsPosVisible(posPart))
					{
						setPartObj.push_back(pPart);
					}
				}
			}			
		}
	}

	// 开始排序,放入setparttest
	DEQUE_MAPOBJ setPartTest;
	setPartTest.clear();
	int nPartAmount = setPartObj.size();
	for(int j = 0; j < nPartAmount; j++)
	{
		C2DMapTerrainObjPart* pPart = (C2DMapTerrainObjPart*)setPartObj[j];	
		this->ApplyShow(pPart, setPartTest);
	}
	setPartObj.clear();

	C2DMapTerrainObjPart* pReturn = NULL; 
	int nTestPartAmount = setPartTest.size();
	int nFocusAmount = 0;
	for(int n = 0; n < nTestPartAmount; n++)
	{
		C2DMapTerrainObjPart* pPart = (C2DMapTerrainObjPart*)setPartTest[n];
		if(pPart && pPart->IsFocus())
		{
			pReturn = pPart;
			nFocusAmount ++;
		}
	}
	setPartTest.clear();
	return pReturn;
}
//-------------------------------------------------------------

void CInteractiveLayer::ApplyShow(CMapObj* pNewObj)
{
	if(!pNewObj)
		return;
	UINT i;
	DWORD dwSize	=m_setMapObjShow.size();
	if(pNewObj->GetObjType() != MAP_TERRAIN_PART)
	{
		try {
		for(i = 0; i < dwSize; i++)
		{
			CMapObj* pObj =  m_setMapObjShow[i];
			if(pObj && pObj->GetObjType() == MAP_TERRAIN_PART)
			{
				C2DMapTerrainObjPart* pPart = (C2DMapTerrainObjPart*)pObj;
				CMyPos posCell;
				pNewObj->GetPos(posCell);
				if(pPart)
				{
					if(pPart->InMyBase(posCell))
					{
						pPart->AddObj(pNewObj);
						return;
					}
				}
			}
			
		}
		}
		catch(...)
		{
			return;
		}
	}
	CMyPos posNewObj;
	pNewObj->GetPos(posNewObj);
	int nNewObjX = posNewObj.x;
	int nNewObjY = posNewObj.y;

	int nOverLayAfter = -1;
	for(i=0; i<dwSize; i++)
	{

		CMapObj* pOldObj	=m_setMapObjShow[i];		
		CMyPos posOldObj;
		pOldObj->GetPos(posOldObj);
		int nOldObjX = posOldObj.x;
		int nOldObjY = posOldObj.y;
		
		CMySize sizeOldObj, sizeNewObj;
		g_objGameMap.GetMapObjSize(sizeOldObj, pOldObj);
		g_objGameMap.GetMapObjSize(sizeNewObj, pNewObj);
	 
 
		// sort now!
		if ((nNewObjX-sizeNewObj.iWidth+1)-nOldObjX > 0 ||
			(nOldObjX-sizeOldObj.iWidth+1)-nNewObjX > 0)
		{	// x no overlay
			
			if ((nNewObjY-sizeNewObj.iHeight+1)-nOldObjY > 0 ||
				(nOldObjY-sizeOldObj.iHeight+1)-nNewObjY > 0)
			{	// y no overlay				
			}
			else // got y overlay
			{
				if (nNewObjX < nOldObjX) 
				{
					int bInsert =i;
					for(int n=i-1;n>=0;n--)///插在与J同行的物件或比当前排序物更近的物件之前
					{
						CMapObj* pObj	=m_setMapObjShow[n];
						if (!pObj)
							continue;
					 
						CMyPos posOldObj;
						pObj->GetPos(posOldObj);
						int nObjX = posOldObj.x;
						int nObjY = posOldObj.y;					 
						if((nOldObjX+nOldObjY == nObjX+nObjY || nNewObjX+nNewObjY < nObjX+nObjY) && n>nOverLayAfter)
							bInsert = n;
						else
						{					
							break;
						}
					}
					nOverLayAfter=-1;
					m_setMapObjShow.insert(m_setMapObjShow.begin()+bInsert, pNewObj);
					break;
				}
				else
				{
					nOverLayAfter = i;
					for(int n=i+1;n<dwSize;n++)///插在与J同行的物件或比当前排序物更近的物件之后
					{
						CMapObj* pObj	=m_setMapObjShow[n];
						if (!pObj)
							continue;
						CMyPos posOldObj;
						pObj->GetPos(posOldObj);
						int nObjX = posOldObj.x;
						int nObjY = posOldObj.y;

						if(nOldObjX+nOldObjY == nObjX+nObjY || nNewObjX+nNewObjY > nObjX+nObjY)
							nOverLayAfter = n;
						else
						{						
							break;;
						}
					}
				}
			}// end of y overlay
		}
		else // got x overlay
		{
			if (nNewObjY < nOldObjY)
			{
				int bInsert =i;
				for(int n=i-1;n>=0;n--)///插在与J同行的物件或比当前排序物更近的物件之前
				{
					CMapObj* pObj	=m_setMapObjShow[n];
					if (!pObj)
						continue;
					CMyPos posOldObj;
					pObj->GetPos(posOldObj);
					int nObjX = posOldObj.x;
					int nObjY = posOldObj.y;

					if((nOldObjX+nOldObjY == nObjX+nObjY || nNewObjX+nNewObjY < nObjX+nObjY) && n>nOverLayAfter)
						bInsert = n;
					else
					{				
						break;
					}
				}
				nOverLayAfter = -1;
				m_setMapObjShow.insert(m_setMapObjShow.begin()+bInsert, pNewObj);
				break;
			}	
			else
			{
				nOverLayAfter =i;
				for(int n=i+1;n<dwSize;n++)///插在与J同行的物件或比当前排序物更近的物件之后
				{
					CMapObj* pObj	=m_setMapObjShow[n];
					if (!pObj)
						continue;
					CMyPos posOldObj;
					pObj->GetPos(posOldObj);
					int nObjX = posOldObj.x;
					int nObjY = posOldObj.y;

					if(nOldObjX+nOldObjY == nObjX+nObjY || nNewObjX+nNewObjY > nObjX+nObjY)
						nOverLayAfter = n;
					else
					{				 
						break;
					}
				}				
			}
		}				
	}
	if(nOverLayAfter!=-1)//insert after nOverLayAfter 
	{
		if(nOverLayAfter >=m_setMapObjShow.size()-1)
			m_setMapObjShow.push_back(pNewObj);
		else
			m_setMapObjShow.insert(m_setMapObjShow.begin()+nOverLayAfter + 1, pNewObj);
	}
	else
	{	
		if (i >= dwSize)	// the last one...
		{
			for (int n=0; n<dwSize; n++)
			{
				CMapObj* pOldObj	=m_setMapObjShow[n];
				if (!pOldObj)
					continue;
				CMyPos posOldObj;
				pOldObj->GetPos(posOldObj);
				int nOldObjX = posOldObj.x;
				int nOldObjY = posOldObj.y;
		
				if (nNewObjX+nNewObjY < nOldObjX+nOldObjY)
				{
					m_setMapObjShow.insert(m_setMapObjShow.begin()+n, pNewObj);
					break;
				}
			}
			if(n>=dwSize)
				m_setMapObjShow.push_back(pNewObj);
		}
	}	
}

//-------------------------------------------------------------
void CInteractiveLayer::ApplyShow(CMapObj* pNewObj, DEQUE_MAPOBJ& m_setApply)
{
	if(!pNewObj)
		return;
	UINT i;
	DWORD dwSize	=m_setApply.size();
	if(pNewObj->GetObjType() != MAP_TERRAIN_PART)
	{
		for(i = 0; i < dwSize; i++)
		{
			CMapObj* pObj =  m_setApply[i];
			if(pObj || pObj->GetObjType() == MAP_TERRAIN_PART)
			{
				C2DMapTerrainObjPart* pPart = (C2DMapTerrainObjPart*)pObj;
				CMyPos posCell;
				pNewObj->GetPos(posCell);
				if(pPart)
				{
					if(pPart->InMyBase(posCell))
					{
						pPart->AddObj(pNewObj);
						return;
					}
				}
			}
			
		}
	}
	CMyPos posNewObj;
	pNewObj->GetPos(posNewObj);
	int nNewObjX = posNewObj.x;
	int nNewObjY = posNewObj.y;
	int nOverLayAfter=-1;
	
	for(i=0; i<dwSize; i++)
	{
		CMapObj* pOldObj	=m_setApply[i];

⌨️ 快捷键说明

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