📄 3dgamemap-back.cpp
字号:
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[64]="ini/region.ini";
FILE* fp = fopen(szIniFile, "r");
if(!fp)
return;
RegionInfo infoRegion;
while (true)
{
int nReturn = fscanf(fp, "%u %u %u %u %u %u %s %s %u %u %u %u\n",
&infoRegion.m_idMap,
&infoRegion.m_dwType,
&infoRegion.m_posCell.x,
&infoRegion.m_posCell.y,
&infoRegion.m_dwCx,
&infoRegion.m_dwCy,
infoRegion.m_szString[0],
infoRegion.m_szString[1],
&infoRegion.m_dwData[0],
&infoRegion.m_dwData[1],
&infoRegion.m_dwData[2],
&infoRegion.m_dwData[3]
);
if(nReturn == EOF)
break;
else if(nReturn != 12)
{
::ErrorMsg("invalid line found in %s.", szIniFile);
continue;
}
RegionInfo* pInfo = new RegionInfo;
MYASSERT(pInfo);
memcpy(pInfo, &infoRegion, sizeof(RegionInfo));
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;
int dx = x1 - x0;
int dy = y1 - y0;
int abs_dx = abs(dx);
int abs_dy = abs(dy);
int flag_dx = dx>0 ? 1:-1;
int flag_dy = dy>0 ? 1:-1;
if(abs_dx > abs_dy)
{
// x 增益
if(dx > 0)
{
// x0 ++
for(int i = x0 + 1; i <= x1; i ++)
{
POINT point;
point.x = i;
point.y = y0 + (dy * (i - x0) * 2 + abs_dx*flag_dy) / (abs_dx * 2);
vctPoint.push_back(point);
}
}
else if(dx < 0)
{
// x0 --
for(int i = x0 - 1; i >= x1; i --)
{
POINT point;
point.x = i;
point.y = y0 + (dy * (x0 - i) * 2 + abs_dx*flag_dy) / (abs_dx * 2);
vctPoint.push_back(point);
}
}
}
else
{
// y 增益
if(dy > 0)
{
// y0 ++
for(int i = y0 + 1; i <= y1; i ++)
{
POINT poi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -