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

📄 3dgamemap.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
	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 + -