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

📄 interactivelayer.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		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_setApply[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;
					}
					
					m_setApply.insert(m_setApply.begin()+bInsert, pNewObj);
					break;
				}
				else
				{
					nOverLayAfter = i;
					for(int n=i+1;n<dwSize;n++)///插在与J同行的物件或比当前排序物更近的物件之后
					{
						CMapObj* pObj	=m_setApply[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;
					}
				}
			}
		}
		else // got x overlay
		{
			if (nNewObjY < nOldObjY)
			{
				int bInsert =i;
				for(int n=i-1;n>=0;n--)///插在与J同行的物件或比当前排序物更近的物件之前
				{
					CMapObj* pObj	=m_setApply[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;
				}
				
				m_setApply.insert(m_setApply.begin()+bInsert, pNewObj);
				break;
			}	
			else
			{
				nOverLayAfter =i;
				for(int n=i+1;n<dwSize;n++)///插在与J同行的物件或比当前排序物更近的物件之后
				{
					CMapObj* pObj	=m_setApply[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_setApply.size()-1)
			m_setApply.push_back(pNewObj);
		else
			m_setApply.insert(m_setApply.begin()+nOverLayAfter + 1, pNewObj);
	}
	else
	{	
		if (i >= dwSize)	// the last one...
		{
			for (int n=0; n<dwSize; n++)
			{
				CMapObj* pOldObj	=m_setApply[n];
				if (!pOldObj)
					continue;
				CMyPos posOldObj;
				pOldObj->GetPos(posOldObj);
				int nOldObjX = posOldObj.x;
				int nOldObjY = posOldObj.y;
		
				if (nNewObjX+nNewObjY < nOldObjX+nOldObjY)
				{
					m_setApply.insert(m_setApply.begin()+n, pNewObj);
					break;
				}
			}
			if(n>=dwSize)
				m_setApply.push_back(pNewObj);
		}
	}	
		


		/*
		// sort now!
		if ((nNewObjX-sizeNewObj.iWidth+1)-nOldObjX > 0 ||
			(nOldObjX-sizeOldObj.iWidth+1)-nNewObjX > 0)
		{	// x no overlay
			
			int nNewData =  nNewObjY-(int)sizeNewObj.iHeight+1;
			int nOldData =  nOldObjY-(int)sizeOldObj.iHeight+1;
			if(nNewData>nOldObjY || nOldData>nNewObjY)
			{
				// y no overlay
				if (nNewObjX+nNewObjY < nOldObjX+nOldObjY)
				{
					m_setApply.insert(m_setApply.begin()+i, pNewObj);
					return;
				}
				// do nothing in this condition
			}
			else // got y overlay
			{
				if (nNewObjX < nOldObjX)
				{
					m_setApply.insert(m_setApply.begin()+i, pNewObj);
					return;
				}
			}
		}
		else // got x overlay
		{
			if (nNewObjY < nOldObjY)
			{
				m_setApply.insert(m_setApply.begin()+i, pNewObj);
				return;
			}
		}
		
	}
	
	//if(i >= dwSize)
	m_setApply.push_back(pNewObj);*/

}
//-------------------------------------------------------------
void CInteractiveLayer::PlaceTerrainObj(C2DMapTerrainObj* pTerrainObj)
{
	if(!pTerrainObj)
		return;
	if(!pTerrainObj->GetFixed())
		return;
	int nAmount = pTerrainObj->GetPartAmount();
	for(int i = 0; i < nAmount; i++)
	{
		C2DMapTerrainObjPart* pPart = pTerrainObj->GetPartByIndex(i);
		if(!pPart)
			return;
		CMySize sizePart;
		pPart->GetBase(sizePart);
		for(int j = 0; j < sizePart.iHeight; j++)
		{
			for(int k = 0; k < sizePart.iWidth; k++)
			{
				CLayer* pLayer = pPart->GetLayer(k, j);
				LayerInfo* pNewLayer = new LayerInfo;
				if(!pNewLayer)
					return;
				CMyPos posCell;
				pPart->GetPos(posCell);
				posCell.x -= k;
				posCell.y -= j;
				CellInfo* pCellInfo = g_objGameMap.GetCell(posCell.x, posCell.y);
				int nAltitude = g_objGameMap.GetGroundAltitude(pCellInfo);
				if(pCellInfo)
				{
					pNewLayer->usMask = pLayer->usMask;
					pNewLayer->usTerrain = pLayer->usTerrain;
					pNewLayer->sAltitude = nAltitude + pLayer->sAltitude;
					pNewLayer->pLayer = NULL;
					g_objGameMap.AddLayer(pCellInfo, pNewLayer);
				}
			}
		}
	}
}
//-------------------------------------------------------------
void CInteractiveLayer::DisplaceTerrainObj(C2DMapTerrainObj* pTerrainObj)
{
	if(!pTerrainObj)
		return;
	if(!pTerrainObj->GetFixed())
		return;
	int nAmount = pTerrainObj->GetPartAmount();
	for(int i = 0; i < nAmount; i++)
	{
		C2DMapTerrainObjPart* pPart = pTerrainObj->GetPartByIndex(i);
		if(!pPart)
			return;
		CMySize sizePart;
		pPart->GetBase(sizePart);
		for(int j = 0; j < sizePart.iHeight; j++)
		{
			for(int k = 0; k < sizePart.iWidth; k++)
			{
				CMyPos posCell;
				pPart->GetPos(posCell);
				posCell.x -= k;
				posCell.y -= j;
				CellInfo* pCellInfo = g_objGameMap.GetCell(posCell.x, posCell.y);
				if(pCellInfo)
				{
					g_objGameMap.DelLastLayer(pCellInfo);
				}
			}
		}
	}
}
//-------------------------------------------------------------
void CInteractiveLayer::Del3DMapEffect(CMyPos posWorld)
{
	int nAmount = m_setMapObj.size();
	for(int i = nAmount-1; i >= 0; i --)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(pObj && (pObj->GetObjType() == MAP_3DEFFECT || pObj->GetObjType() == MAP_3DEFFECTNEW))
		{
			C3DMapEffect* pEffect = (C3DMapEffect*)pObj;
			CMyPos posWorld;
			pEffect->GetWorldPos(posWorld);
			if((posWorld.x == posWorld.x) &&
				(posWorld.y == posWorld.y))
			{
				SAFE_DELETE(pEffect);
				m_setMapObj.erase(m_setMapObj.begin()+i);
			}
		}
	}
}
//-------------------------------------------------------------
void CInteractiveLayer::Del3DMapEffect(C3DMapEffect* pEffect)
{
	int nAmount = m_setMapObj.size();
	for(int i = nAmount-1; i >= 0; i --)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(pObj && (pObj->GetObjType() == MAP_3DEFFECT || pObj->GetObjType() == MAP_3DEFFECTNEW) && pEffect == pObj)
		{
			pEffect->Die();
			return;
		}
	}
}
//-------------------------------------------------------------
void CInteractiveLayer::Del3DMapItem(OBJID idItem)
{
	int nAmount = m_setMapObj.size();
	for(int i = nAmount-1; i >= 0; i --)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(pObj && pObj->GetObjType() == MAP_3DITEM)
		{
			C3DMapItem* pItem = (C3DMapItem*)pObj;
			if(pItem->GetID() == idItem)
			{
				SAFE_DELETE(pItem);
				m_setMapObj.erase(m_setMapObj.begin() + i);
				return;
			}
		}
	}
}

void CInteractiveLayer::Del2DMapItem(OBJID idItemtype)
{
	int nAmount = m_setMapObj.size();
	for(int i = nAmount-1; i >= 0; i --)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(pObj && pObj->GetObjType() == MAP_2DITEM)
		{
			C2DMapItem* pItem = (C2DMapItem*)pObj;
			if(pItem->GetItemID() == idItemtype)
			{
				SAFE_DELETE(pItem);
				m_setMapObj.erase(m_setMapObj.begin() + i);
				return;
			}
		}
	}
}
//-------------------------------------------------------------
int CInteractiveLayer::GetObjAmount()
{
	return m_setMapObj.size();
}
//-------------------------------------------------------------
CMapObj* CInteractiveLayer::GetObjByIndex(int nIndex)
{
	if((nIndex<0) || (nIndex >= m_setMapObj.size()))
		return NULL;
	return m_setMapObj[nIndex];
}
//-------------------------------------------------------------
C2DMapCoverObj* CInteractiveLayer::GetMapCoverObj(CMyPos posCell)
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(pObj->GetObjType() == MAP_COVER)
		{
			CMyPos posMyCell;
			pObj->GetPos(posMyCell);
			if((posMyCell.x == posCell.x) && (posMyCell.y == posCell.y))
				return (C2DMapCoverObj*)pObj;
		}
	}
	return NULL;
}
//-------------------------------------------------------------
C3DMapEffect* CInteractiveLayer::Get3DFocusMapEffect()
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMapObj* pObj = m_setMapObj[i];
		if(pObj->GetObjType() == MAP_3DEFFECT || pObj->GetObjType() == MAP_3DEFFECTNEW)
		{
			C3DMapEffect* pEffect = (C3DMapEffect*)pObj;
			if(pEffect->IsFocus())
				return pEffect;
		}
	}
	return NULL;
}
//-------------------------------------------------------------
OBJID CInteractiveLayer::Get3DMapItem(CMyPos posCell)
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMapObj* pObj = m_setMapObj[i];
		CMyPos posObj;
		pObj->GetPos(posObj);
		if((pObj->GetObjType() == MAP_3DITEM || pObj->GetObjType() == MAP_2DITEM) && posObj.x == posCell.x && posObj.y == posCell.y)
		{
			C3DMapItem* pItem = (C3DMapItem*)pObj;
			return pItem->GetID();
		}
	}
	return ID_NONE;
}

OBJID CInteractiveLayer::Get2DMapItem(CMyPos posCell)
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMapObj* pObj = m_setMapObj[i];
		CMyPos posObj;
		pObj->GetPos(posObj);
		if(pObj->GetObjType() == MAP_2DITEM && posObj.x == posCell.x && posObj.y == posCell.y)
		{
			C2DMapItem* pItem = (C2DMapItem*)pObj;
			return pItem->GetItemType();
		}
	}
	return ID_NONE;
}
//-------------------------------------------------------------
OBJID CInteractiveLayer::GetFocus3DMapItem(CMyPos& posCell)
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMapObj* pObj = m_setMapObj[i];
		CMyPos posObj;
		pObj->GetPos(posObj);
		if(pObj->GetObjType() == MAP_3DITEM)
		{
			C3DMapItem* pItem = (C3DMapItem*)pObj;
			if(pItem->IsFocus())
			{
				pItem->GetPos(posCell);
				return pItem->GetID();
			}
		}
	}
	return ID_NONE;
}

OBJID CInteractiveLayer::GetFocus2DMapItem(CMyPos& posCell)
{
	int nAmount = m_setMapObj.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMapObj* pObj = m_setMapObj[i];
		CMyPos posObj;
		pObj->GetPos(posObj);
		if(pObj->GetObjType() == MAP_2DITEM)
		{
			C2DMapItem* pItem = (C2DMapItem*)pObj;
			if(pItem->IsFocus())
			{
				pItem->GetPos(posCell);
				return pItem->GetItemID();
			}
		}
	}
	return ID_NONE;
}
//-------------------------------------------------------------

⌨️ 快捷键说明

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