📄 interactivelayer.cpp
字号:
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 + -