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