📄 3dgamemap.cpp
字号:
{
return this->GetTerrain(posCell.x, posCell.y);
}
//--------------------------------------------------------------
int CGameMap::GetTerrain(int nPosX, int nPosY)
{
CellInfo* pInfo = this->GetCell(nPosX, nPosY);
return CGameMap::GetTerrain(pInfo);
}
//--------------------------------------------------------------
void CGameMap::AddMagicEffect(CMagicEffect* pEffect)
{
if(pEffect)
m_objMagicEffectManager.AddMagicEffect(pEffect);
}
//--------------------------------------------------------------
void CGameMap::Add3DMapMagicItem(OBJID idType, OBJID id, CMyPos posCell)
{
CInteractiveLayer* pLayer = this->GetInteractiveLayer();
if(pLayer)
{
int nAmount = pLayer->GetObjAmount();
for(int i = 0; i < nAmount; i ++)
{
CMapObj* pObj = pLayer->GetObjByIndex(i);
if(pObj && pObj->GetObjType() == MAP_3DMAGICMAPITEM)
{
C3DMagicMapItem* pItem = (C3DMagicMapItem*) pObj;
if(pItem->GetID() == idType)
{
return;
}
}
}
C3DMagicMapItem* pItem = C3DMagicMapItem::CreateNew(idType, id);
if(pItem)
{
pItem->SetPos(posCell);
pLayer->AddMapObj(pItem);
}
}
}
//--------------------------------------------------------------
void CGameMap::SetARGB(DWORD dwARGB)
{
ColorEffectInfo.dwOldColor = dwARGB;
m_dwMapARGB = dwARGB;
}
//--------------------------------------------------------------
BOOL CGameMap::Outof9Block(CMyPos posHero, CMyPos posTarget)
{
/*
CMyPos posBlock;
posBlock.x = posHero.x/_BLOCK_SIZE;
posBlock.y = posHero.y/_BLOCK_SIZE;
CMyPos posBegin, posEnd;
posBegin.x = posBlock.x * _BLOCK_SIZE - _BLOCK_SIZE;
posBegin.y = posBlock.y * _BLOCK_SIZE - _BLOCK_SIZE;
posEnd.x = posBlock.x * _BLOCK_SIZE + 2*_BLOCK_SIZE;
posEnd.y = posBlock.y * _BLOCK_SIZE + 2*_BLOCK_SIZE;
if((posTarget.x >= posBegin.x) &&
(posTarget.x < posEnd.x) &&
(posTarget.y >= posBegin.y) &&
(posTarget.y < posEnd.y))
return false;
return true;
*/
if((abs(posHero.x - posTarget.x) > _BLOCK_SIZE) ||
(abs(posHero.y - posTarget.y) > _BLOCK_SIZE))
return true;
return false;
}
//--------------------------------------------------------------
void CGameMap::SetScale(int nScale)
{
m_nScale = nScale;
ScaleEffectInfo.nOldScale = nScale;
m_nRealScreenWidth = _SCR_WIDTH * _NORMAL_SCALE / m_nScale;
m_nRealScreenHeight = _SCR_HEIGHT * _NORMAL_SCALE / m_nScale;
}
//--------------------------------------------------------------
void CGameMap::MapScaleShowPos(int& nX, int& nY)
{
// 基准点为视口中心点
CMyPos posReference = {_SCR_WIDTH/2, _SCR_HEIGHT/2};
nX = posReference.x + (nX - posReference.x) * this->GetScale()/_NORMAL_SCALE;
nY = posReference.y + (nY - posReference.y) * this->GetScale()/_NORMAL_SCALE;
}
//--------------------------------------------------------------
void CGameMap::MapScaleMousePos(int& nX, int& nY)
{
CMyPos posReference = {_SCR_WIDTH/2, _SCR_HEIGHT/2};
nX = posReference.x + (nX - posReference.x) * _NORMAL_SCALE / this->GetScale();
nY = posReference.y + (nY - posReference.y) * _NORMAL_SCALE / this->GetScale();
}
//--------------------------------------------------------------
void CGameMap::SetID(OBJID idMap)
{
if(m_idMap != idMap)
{
m_bShowGobalRegionEffect = true;
}
m_idMap = idMap;
this->SelectRegionData();
g_objGameMap.ProcessRegion(g_objHero.GetAlignPos());
}
//--------------------------------------------------------------
OBJID CGameMap::GetID()
{
return m_idMap;
}
//--------------------------------------------------------------
void CGameMap::SetIDDoc(OBJID idMapDoc)
{
m_idDoc = idMapDoc;
}
//--------------------------------------------------------------
OBJID CGameMap::GetIDDoc()
{
return m_idDoc;
}
//--------------------------------------------------------------
void CGameMap::SetType(DWORD dwType)
{
m_dwType = dwType;
}
//--------------------------------------------------------------
DWORD CGameMap::GetType()
{
return m_dwType;
}
//--------------------------------------------------------------
void CGameMap::CreateRegionData()
{
this->DestroyRegionData();
const char szIniFile[] = "ini/Region.ini";
FILE* fp = fopen(szIniFile, "r");
if (!fp)
{
::ErrorOut("error on open %s.", szIniFile);
return;
}
while(true)
{
// scan title
char szLine[1024] = "";
if (EOF == fscanf(fp, "%s\n", szLine))
break;
// get info ...
char szTitle[_MAX_STRING] = "";
if (1 != sscanf(szLine, "[%s]", szTitle))
continue;
RegionInfo* pInfo = new RegionInfo;
MYASSERT (pInfo);
BOOL bSucRead = true;
bSucRead &= fscanf(fp, "MapID=%d\n", &pInfo->m_idMap);
bSucRead &= fscanf(fp, "RegionType=%d\n", &pInfo->m_dwType);
bSucRead &= fscanf(fp, "X=%d\n", &pInfo->m_posCell.x);
bSucRead &= fscanf(fp, "Y=%d\n", &pInfo->m_posCell.y);
bSucRead &= fscanf(fp, "Cx=%d\n", &pInfo->m_dwCx);
bSucRead &= fscanf(fp, "Cy=%d\n", &pInfo->m_dwCy);
bSucRead &= fscanf(fp, "Effect=%s\n", pInfo->m_szString[0]);
bSucRead &= fscanf(fp, "RegionName=%s\n", pInfo->m_szString[1]);
bSucRead &= fscanf(fp, "Ncolor=%d\n", &pInfo->m_nNColor);
bSucRead &= fscanf(fp, "NshowType=%d\n", &pInfo->m_nNShowType);
bSucRead &= fscanf(fp, "RegionDes=%s\n", pInfo->m_szString[2]);
bSucRead &= fscanf(fp, "Dcolor=%d\n", &pInfo->m_nDColor);
bSucRead &= fscanf(fp, "DshowPos=%d\n", &pInfo->m_nDShowPos);
bSucRead &= fscanf(fp, "DshowType=%d\n", &pInfo->m_nDShowType);
bSucRead &= fscanf(fp, "DAccess=%d\n", &pInfo->m_nDAccess);
if (!bSucRead)
{
::ErrorOut("error data: %s of %s", szTitle, szIniFile);
break;
}
// keep it
m_setRegionData.push_back(pInfo);
}
fclose(fp);
}
//--------------------------------------------------------------
void CGameMap::DestroyRegionData()
{
int nAmount = m_setRegionData.size();
for(int i = 0; i < nAmount; i ++)
{
RegionInfo* pInfo = m_setRegionData[i];
SAFE_DELETE(pInfo);
}
m_setRegionData.clear();
}
//--------------------------------------------------------------
void CGameMap::SelectRegionData()
{
CTerrainLayer* pLayer = this->GetTerrainLayer();
MYASSERT(pLayer);
pLayer->ClearRegion();
int nAmount = m_setRegionData.size();
for(int i = 0; i < nAmount; i ++)
{
RegionInfo* pInfo = m_setRegionData[i];
if(pInfo && pInfo->m_idMap == m_idMap)
{
C2DMapRegion* pRegion = C2DMapRegion::CreateNew(pInfo);
if(pRegion)
{
pLayer->AddRegion(pRegion);
}
}
}
}
//--------------------------------------------------------------
void CGameMap::BeginShakeEffect(int nEffectType)
{
ShakeEffectInfo.dwFrameAmount = 60;
ShakeEffectInfo.dwTimeBegin = ::TimeGet();
ShakeEffectInfo.dwFrameInterval = 50;
ShakeEffectInfo.dwSwing = 8;
ShakeEffectInfo.bOn = true;
}
//--------------------------------------------------------------
void CGameMap::BeginScaleEffect(int nEffectType)
{
if(!ScaleEffectInfo.bOn)
ScaleEffectInfo.nOldScale = this->GetScale();
ScaleEffectInfo.dwFrameAmount = 30;
ScaleEffectInfo.dwTimeBegin = ::TimeGet();
ScaleEffectInfo.dwFrameInterval = 150;
ScaleEffectInfo.dwSwing = 64;
ScaleEffectInfo.bOn = true;
}
//--------------------------------------------------------------
void CGameMap::BeginColorEffect(int nEffectType)
{
if(!ColorEffectInfo.bOn)
ColorEffectInfo.dwOldColor = m_dwMapARGB;
ColorEffectInfo.bRed = (ColorEffectInfo.dwOldColor&0x00ffffff)>>16;
ColorEffectInfo.bGreen = (ColorEffectInfo.dwOldColor&0x0000ffff)>>8;
ColorEffectInfo.bBlue = ColorEffectInfo.dwOldColor&0x000000ff;
ColorEffectInfo.bRedE = 0x22;
ColorEffectInfo.bGreenE = 0x22;
ColorEffectInfo.bBlueE = 0x22;
ColorEffectInfo.bOn = true;
ColorEffectInfo.dwChangeDuration = 2000;
ColorEffectInfo.dwChangeBackDuration = 2000;
ColorEffectInfo.dwDuration = 2000;
ColorEffectInfo.dwTimeBegin = ::TimeGet();
}
//--------------------------------------------------------------
void CGameMap::ProcessShakeEffect()
{
if(!ShakeEffectInfo.bOn)
return;
// get current frame index
DWORD dwFrameIndex = (::TimeGet() - ShakeEffectInfo.dwTimeBegin) / ShakeEffectInfo.dwFrameInterval;
if(dwFrameIndex > ShakeEffectInfo.dwFrameAmount)
{
ShakeEffectInfo.bOn = false;
m_posViewOffset.x = m_posViewOffset.y = 0;
return;
}
switch(dwFrameIndex%4)
{
case 0:
m_posViewOffset.x -= ShakeEffectInfo.dwSwing;
break;
case 1:
m_posViewOffset.x += ShakeEffectInfo.dwSwing;
break;
case 2:
m_posViewOffset.y -= ShakeEffectInfo.dwSwing;
break;
case 3:
m_posViewOffset.y += ShakeEffectInfo.dwSwing;
break;
}
}
//--------------------------------------------------------------
void CGameMap::ProcessScaleEffect()
{
if(!ScaleEffectInfo.bOn)
return;
// get current frame index
DWORD dwTimePass = ::TimeGet() - ScaleEffectInfo.dwTimeBegin;
DWORD dwFrameIndex = dwTimePass / ScaleEffectInfo.dwFrameInterval;
if(dwFrameIndex > ScaleEffectInfo.dwFrameAmount)
{
ScaleEffectInfo.bOn = false;
this->SetScale(ScaleEffectInfo.nOldScale);
return;
}
int nScaleOffset = ScaleEffectInfo.dwSwing * (dwTimePass - dwFrameIndex * ScaleEffectInfo.dwFrameInterval) / ScaleEffectInfo.dwFrameInterval;
if(dwFrameIndex%2 == 0)
m_nScale = _NORMAL_SCALE + nScaleOffset;
else
m_nScale = _NORMAL_SCALE + (ScaleEffectInfo.dwSwing - nScaleOffset);
}
//--------------------------------------------------------------
void CGameMap::ProcessColorEffect()
{
if(!ColorEffectInfo.bOn)
return;
DWORD dwTimePass = ::TimeGet() - ColorEffectInfo.dwTimeBegin;
if(dwTimePass > ColorEffectInfo.dwChangeDuration + ColorEffectInfo.dwDuration + ColorEffectInfo.dwChangeBackDuration)
{
m_dwMapARGB = ColorEffectInfo.dwOldColor;
ColorEffectInfo.bOn = false;
return;
}
if(dwTimePass < ColorEffectInfo.dwChangeDuration)
{
DWORD dwCurrentR = ColorEffectInfo.bRed + (ColorEffectInfo.bRedE - ColorEffectInfo.bRed)*(int)dwTimePass/(int)ColorEffectInfo.dwChangeDuration;
DWORD bCurrentG = ColorEffectInfo.bGreen + (ColorEffectInfo.bGreenE - ColorEffectInfo.bGreen)*(int)dwTimePass/(int)ColorEffectInfo.dwChangeDuration;
DWORD bCurrentB = ColorEffectInfo.bBlue + (ColorEffectInfo.bBlueE - ColorEffectInfo.bBlue)*(int)dwTimePass/(int)ColorEffectInfo.dwChangeDuration;
DWORD dwCurrentColor = ColorEffectInfo.dwOldColor & 0xff000000 + (dwCurrentR<<16) + (bCurrentG<<8) + bCurrentB;
m_dwMapARGB = dwCurrentColor;
}
else if(dwTimePass < ColorEffectInfo.dwChangeDuration + ColorEffectInfo.dwDuration)
{
DWORD dwCurrentColor = ColorEffectInfo.dwOldColor & 0xff000000 + (ColorEffectInfo.bRedE<<16) + (ColorEffectInfo.bGreenE<<8) + ColorEffectInfo.bBlueE;
m_dwMapARGB = dwCurrentColor;
}
else
{
DWORD dwMyTimePass = dwTimePass - ColorEffectInfo.dwChangeDuration - ColorEffectInfo.dwDuration;
DWORD dwCurrentR = ColorEffectInfo.bRedE - (ColorEffectInfo.bRedE - ColorEffectInfo.bRed)*(int)dwMyTimePass/(int)ColorEffectInfo.dwChangeBackDuration;
DWORD bCurrentG = ColorEffectInfo.bGreenE - (ColorEffectInfo.bGreenE - ColorEffectInfo.bGreen)*(int)dwMyTimePass/(int)ColorEffectInfo.dwChangeBackDuration;
DWORD bCurrentB = ColorEffectInfo.bBlueE - (ColorEffectInfo.bBlueE - ColorEffectInfo.bBlue)*(int)dwMyTimePass/(int)ColorEffectInfo.dwChangeBackDuration;
DWORD dwCurrentColor = ColorEffectInfo.dwOldColor & 0xff000000 + (dwCurrentR<<16) + (bCurrentG<<8) + bCurrentB;
m_dwMapARGB = dwCurrentColor;
}
}
//--------------------------------------------------------------
void CGameMap::LastMapMagicItem(OBJID id)
{
CInteractiveLayer* pLayer = this->GetInteractiveLayer();
if(pLayer)
{
int nAmount = pLayer->GetObjAmount();
for(int i = 0; i < nAmount; i ++)
{
CMapObj* pObj = pLayer->GetObjByIndex(i);
if(pObj && pObj->GetObjType() == MAP_3DMAGICMAPITEM)
{
C3DMagicMapItem* pItem = (C3DMagicMapItem*) pObj;
if(pItem->GetID() == id)
{
pItem->Last();
}
}
}
}
}
//--------------------------------------------------------------
void CGameMap::EndMapMagicItem(OBJID id)
{
CInteractiveLayer* pLayer = this->GetInteractiveLayer();
if(pLayer)
{
int nAmount = pLayer->GetObjAmount();
for(int i = 0; i < nAmount; i ++)
{
CMapObj* pObj = pLayer->GetObjByIndex(i);
if(pObj && pObj->GetObjType() == MAP_3DMAGICMAPITEM)
{
C3DMagicMapItem* pItem = (C3DMagicMapItem*) pObj;
if(pItem->GetID() == id)
{
pItem->End();
}
}
}
}
}
//--------------------------------------------------------------
void CGameMap::SetShowExpFlag(BOOL bShow)
{
if(m_bShowExp != bShow)
m_dwOldExp = g_objHero.GetExp();
m_bShowExp = bShow;
}
//--------------------------------------------------------------
void CGameMap::ShowExp()
{
int nExp = g_objHero.GetExp();
int nExpNextLevel = g_objHero.GetNextLevelExp();
CMyPos posShow = {50, _SCR_HEIGHT-110};
if(nExpNextLevel == 0)
{
if(m_bShowExp)
CMyBitmap::ShowString(posShow.x, posShow.y, 0xff01f546, g_objGameDataSet.GetStr(100138), "楷体", 18, true);
return;
}
double dRate = (double)nExp*100/nExpNextLevel;
char szRate[256];
OBJID idStr = 100135;
sprintf(szRate,g_objGameDataSet.GetStr(idStr),(float)dRate);
if(m_bShowExp)
CMyBitmap::ShowString(posShow.x, posShow.y, 0xff01f546, szRate, "楷体", 18, true);
int nShowX = 60 + strlen(szRate)*9;
if(m_bShowExp && m_dwShowExp > 0 && (::TimeGet() - m_dwTimeExpBegin) < 2000)
{
char szExp[64];
sprintf(szExp, "+%u", m_dwShowExp);
CMyBitmap::ShowString(nShowX, posShow.y, 0xff01f546, szExp, "楷体", 18, true);
}
}
//--------------------------------------------------------------
void CGameMap::SetShowExp(DWORD dwExp)
{
m_dwTimeExpBegin = ::TimeGet();
m_dwShowExp = dwExp;
}
//--------------------------------------------------------------
TerrainWeatherInfo* CGameMap::GetDefaultWeatherInfo()
{
CMyPos posHero;
g_objHero.GetPos(posHero);
int nTerrain = this->GetTerrain(posHero);
return g_obj3DRoleData.GetWeatherInfo(nTerrain);
}
//--------------------------------------------------------------
void CGameMap::DDALine(int x0, int y0, int x1, int y1, vector<POINT>& vctPoint)
{
vctPoint.clear();
if (x0 == x1 && y0 == y1)
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -