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

📄 team.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
字号:
// Team.cpp: implementation of the CTeam class.
//
//////////////////////////////////////////////////////////////////////

#include "Team.h"
#include "Player.h"
#include "GamePlayerSet.h"
#include "Hero.h"
#include "gamedataset.h"
#include "3DGameMap.h"
#include "AllMsg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTeam::CTeam()
{
	m_setMember.clear();
	this->OpenTeam();
	m_nFocusIndex = 0;
	m_dwTimeBegin = ::TimeGet();
	m_nFocusIndex = -1;
}

CTeam::~CTeam()
{
	this->Destroy();
}
//------------------------------------------------------------------
void CTeam::Destroy()
{
	int nAmount = m_setMember.size();
	for(int i = nAmount-1; i >= 0; i --)
	{
		TeamMemberInfo* pInfo = m_setMember[i];
		SAFE_DELETE(pInfo);
	}
	m_setMember.clear();	
}
//------------------------------------------------------------------
void CTeam::AddMember(TeamMemberInfo* pInfo)
{
	if(!pInfo)
		return;

	// 搜索,如果存在,替换之
	int nAmount = m_setMember.size();
	for(int i = 0; i < nAmount; i ++)
	{
		TeamMemberInfo* pMyInfo = m_setMember[i];
		if(pMyInfo && (pMyInfo->id == pInfo->id))
		{
			memcpy(pMyInfo, pInfo, sizeof(TeamMemberInfo));
			return;
		}
	}
	
	// 没有搜索到,添加之
	pInfo->m_dwQueryBegin = ::TimeGet();
	m_setMember.push_back(pInfo);
}
//------------------------------------------------------------------
void CTeam::DelMember(OBJID idMember)
{
	int nAmount = m_setMember.size();
	for(int i = nAmount-1; i >= 0; i --)
	{
		TeamMemberInfo* pInfo = m_setMember[i];
		if(pInfo && (pInfo->id ==idMember))
		{
			SAFE_DELETE(pInfo);
			m_setMember.erase(m_setMember.begin() + i);
		}
	}
}
//------------------------------------------------------------------
TeamMemberInfo* CTeam::GetMemberInfo(OBJID idMember)
{
	int nAmount = m_setMember.size();
	for(int i = 0; i < nAmount; i++)
	{
		TeamMemberInfo* pInfo = m_setMember[i];
		if(pInfo && (pInfo->id == idMember))
		{
			return pInfo;
		}
	}
	return NULL;
}
//------------------------------------------------------------------
TeamMemberInfo* CTeam::GetMemberInfoByIndex(int nIndex)
{
	int nAmount = m_setMember.size();
	if((nIndex >= nAmount) || (nIndex < 0))
	{
		return NULL;
	}
	return m_setMember[nIndex];
}
//------------------------------------------------------------------
int CTeam::GetMemberInfoAmount()
{
	return m_setMember.size();
}
//------------------------------------------------------------------
BOOL CTeam::SetLastApplyID(OBJID idPlayer)
{
	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idPlayer);
	if(!pPlayer)
		return false;

	m_idPlayerLastApply = pPlayer->GetID();	
	strcpy(m_szNamePlayerLastApply, pPlayer->GetName());
	return true;
}
//------------------------------------------------------------------
TeamMemberInfo* CTeam::CreateNewMemberInfo(char* pszName, OBJID id, DWORD dwFace, DWORD dwHp, DWORD dwMaxHp, DWORD dwLook)
{
	if(!pszName)
		return NULL;

	TeamMemberInfo* pInfo = new TeamMemberInfo;
	if(!pInfo)
		return NULL;
	
	strcpy(pInfo->szName, pszName);
	pInfo->id = id;
	pInfo->dwFace = dwFace;
	pInfo->dwHp = dwHp;
	pInfo->dwMaxHp = dwMaxHp;
	pInfo->dwLook = dwLook;
	// 判断是否Active
	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(pInfo->id);
	if(!pPlayer)
	{
		pInfo->bActive = false;
	}
	else
	{
		pInfo->bActive = true;
	}
	return pInfo;
}
//------------------------------------------------------------------
void CTeam::Process()
{
	int nAmount = m_setMember.size();
	for(int i = 0; i < nAmount; i ++)
	{
		TeamMemberInfo* pInfo = m_setMember[i];
		if(pInfo)
		{
			if(pInfo->id != g_objHero.GetID())
			{
				// 判断是否Active
				CPlayer* pPlayer = g_objPlayerSet.GetPlayer(pInfo->id);
				if(!pPlayer)
				{
					pInfo->bActive = false;
				}
				else
				{
					pInfo->bActive = true;
				}
			}
		}
	}
}
//------------------------------------------------------------------
void CTeam::Show(CMyPos posBegin)
{
	int nAmount = m_setMember.size();
	CMySize sizeBmp = {46, 46};
	CMySize sizeHpBar = {5, 46};
	int nIconAmount = 0;

	// show arrow first
	if(!(g_objHero.IsTeamLeader() && m_nFocusIndexFrame==0)&& (this->GetMemberInfoAmount() != 0))
	{

		TeamMemberInfo* pInfo = this->GetMemberInfoByIndex(m_nFocusIndexFrame);
		if(pInfo)
		{
			CPlayer* pLeader = g_objPlayerSet.GetPlayer(pInfo->id);
			if(pLeader)
			{
				char szCommonAni[] = "ani/common.ani";
				char szArrow[] = "Arrow";
				CAni* pAni = g_objGameDataSet.GetDataAni(szCommonAni, szArrow);

				CMyPos posHero = {0, 0};
				CMyPos posLeader = {0, 0};
				g_objHero.GetPos(posHero);
				pLeader->GetPos(posLeader);

				if(abs(posLeader.x - posHero.x) > 4 || abs(posLeader.y - posHero.y) > 4)
				{
					
					int nDir = CGameMap::GetDirection(posLeader.x, posLeader.y, posHero.x, posHero.y);
					nDir--;
					if(nDir < 0)
						nDir = 7;
					if(pAni)
					{
						CMyBitmap* pBmp = pAni->GetFrame(nDir);
						if(pBmp)
						{
							CMyPos posShow;
							posShow.x = _SCR_WIDTH - 48;
							posShow.y = posBegin.y - 20;
							pBmp->Show(posShow.x, posShow.y);
						}
					}
				}
			}
		}
	}
	int nFocusIndex = -1;
	m_nFocusIndexFrame = -1;
	for(int i = 0; i < nAmount; i ++)
	{
		TeamMemberInfo* pInfo = m_setMember[i];
		if(pInfo && pInfo->id != g_objHero.GetID())
		{
			// 计算位置
			CMyPos posShow;
			posShow.x = _SCR_WIDTH - sizeBmp.iWidth;
			posShow.y = posBegin.y + nIconAmount * (sizeBmp.iHeight + 20) + 48;

			CAni* pAni = g_objGameDataSet.GetPlayerFaceIcon(pInfo->dwFace, pInfo->dwLook);
			if(pAni)
			{
				CMyBitmap* pBmp = pAni->GetFrame(0);
				if(pBmp)
				{
					
					CMyPos posMouse;
					BOOL bFocus = false;
					::MouseCheck(posMouse.x, posMouse.y);
					if((posMouse.x > posShow.x) &&
						(posMouse.y > posShow.y) &&
						(posMouse.x < posShow.x+sizeBmp.iWidth) &&
						(posMouse.y < posShow.y+sizeBmp.iHeight))
					{
						// show name...
						bFocus = true;
						nFocusIndex = i;
						m_nFocusIndexFrame = i;
						CMySize sizeFont;
						CMyBitmap::GetFontSize(sizeFont);
						CMyBitmap::ShowString(_SCR_WIDTH - sizeFont.iWidth * strlen(pInfo->szName), posShow.y-sizeFont.iHeight, 0xffff00, pInfo->szName); 
					}
					if(pInfo->bActive)
					{
						pBmp->SetColor(0xff, 0xff, 0xff, 0xff);
					}
					else
					{
						pBmp->SetColor(0xff, 0xff, 0xff, 0xff);
						CMyBitmap::ShowBlock(posShow.x, posShow.y, posShow.x+sizeBmp.iWidth, posShow.y+sizeBmp.iHeight, 0x77000000);
					}
					pBmp->ShowEx(posShow.x, posShow.y, NULL, sizeBmp.iWidth, sizeBmp.iHeight);

					if(bFocus && !pInfo->bActive)
					{
						CAni* pAni = g_objGameDataSet.GetDataAni("ani/common.ani", "Magnifier");
						if(pAni)
						{
							int nFrameAmount = pAni->GetFrameAmount();
							int nFrameIndex = ((::TimeGet() - m_dwTimeBegin)/300)%nFrameAmount;
							CMyBitmap* pBmp =  pAni->GetFrame(nFrameIndex);
							if(pBmp)
								pBmp->Show(posShow.x, posShow.y);
						}
						if(m_nFocusIndex != i)
						{
							m_nFocusIndex = i;
							m_dwTimeFocusBegin = ::TimeGet();
						}
						else
						{
							if((::TimeGet() - m_dwTimeFocusBegin > 500) && (::TimeGet() - pInfo->m_dwQueryBegin > 2000))
							{
								// begin query ...
								CMsgAction msg;
								m_nFocusIndex = -1;
								if(msg.Create(pInfo->id, 0, 0, 0, actionQueryTeamMember, pInfo->id))
									msg.Send();
								pInfo->m_dwQueryBegin = ::TimeGet();
							}
						}
						
					}
					
					if(pInfo->bActive)
					{
						int nHeight = pInfo->dwHp * sizeBmp.iHeight / pInfo->dwMaxHp;
						posShow.x = _SCR_WIDTH - sizeHpBar.iWidth;
						posShow.y = posShow.y + sizeHpBar.iHeight - nHeight;
						if(nHeight*3 < sizeHpBar.iHeight)
						{
							CMyBitmap::ShowBlock(posShow.x, posShow.y, posShow.x+sizeHpBar.iWidth, posShow.y+nHeight, 0xffff0000);							
						}
						else
						{
							CMyBitmap::ShowBlock(posShow.x, posShow.y, posShow.x+sizeHpBar.iWidth, posShow.y+nHeight, 0xffffff00);							
						}

					}
				}
			}
			nIconAmount ++;
		}
	}
	if(nFocusIndex == -1)
	{
		m_nFocusIndex = -1;
		m_dwTimeFocusBegin = ::TimeGet();
	}

}
//------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -