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

📄 cmessage.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏消息管理模块
//CMessage.cpp
//游戏引擎中的消息管理部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/25 by kylinx
//--------------------------------------------------------------------------------------------------------
#include"CMessage.h"
#include"CError.h"
#include"CGame.h"
#include"CMagic.h"
#include"CRole.h"
#include"CScript.h"
#include"CGraph.h"
#include"CTalk.h"
////////////////////////////////////////////////////////////////////////////////////////////
//构造
////////////////////////////////////////////////////////////////////////////////////////////
CMessage::CMessage()
{
	m_pLog=NULL;
	m_pMsgHead=NULL;
	m_pMsgTail=NULL;
	m_nMsgCount=0;
}
////////////////////////////////////////////////////////////////////////////////////////////
//析构
////////////////////////////////////////////////////////////////////////////////////////////
CMessage::~CMessage()
{
	ClearAllMessage();
}
////////////////////////////////////////////////////////////////////////////////////////////
//初始化
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMessage::InitMessageQueue(CLog*pLog)							//初始化
{
	if(!pLog)
		return false;
	m_pLog=pLog;

	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//添加一条最紧急的消息
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMessage::PostPriortyMessage(const STMessage&msg)				
{
	return AddMessage(msg,0xffffffff);
}
////////////////////////////////////////////////////////////////////////////////////////////
//添加一条消息,默认优先级为0
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMessage::AddMessage(STMessage msg,DWORD Priority)
{
	if(!m_pMsgHead)
	{
		m_pMsgHead=new STMessageNode(msg,Priority);					//分配内存
		if(!m_pMsgHead)
		{
			m_pLog->WriteMessage("New Message Node Failed!Out of memory!\n");
			return false;
		}
		m_pMsgTail=m_pMsgHead;										//设置尾指针
		m_nMsgCount++;
		return true;
	}
	STMessageNode*pNode=new STMessageNode(msg,Priority);			//新节点
	if(!pNode)
	{
		m_pLog->WriteMessage("New Message Node Failed!Out of memory!\n");
		return false;
	}

	m_nMsgCount++;
	
	if(!m_pMsgHead->next)													//如果只有头节点
	{
		if( m_pMsgHead->Priority < pNode->Priority )						//如果头节点的优先级没有要插入的节点的优先级高
		{
			pNode->next=m_pMsgHead;
			m_pMsgHead=pNode;
			m_pMsgTail=m_pMsgHead->next;

			return true;
		}
		else
		{
			m_pMsgHead->next=pNode;
			m_pMsgTail=m_pMsgHead->next;
			return true;
		}
	}
	if(pNode->Priority==0)													//如果是默认的优先级
	{

		m_pMsgTail->next=pNode;
		m_pMsgTail=pNode;
		return true;
	}


	STMessageNode*pNodePrev=m_pMsgHead;
	STMessageNode*pTemp=m_pMsgHead->next;
	while(pTemp)
	{
		if(pTemp->Priority <= pNode->Priority)								//如果该节点优先级不高于待插入的节点优先级
		{
			if(m_pMsgHead->next==pTemp)										//如果这个节点是头节点的下一个节点
			{
				m_pMsgHead->next=pNode;										//修改头节点下一个的指针
				pNode->next=pTemp;											//连接起来
				return true;
			}
			else
			{
				pNodePrev->next=pNode;
				pNode->next=pTemp;
				return true;
			}
		}
		pNodePrev=pTemp;
		pTemp=pTemp->next;
	}
	pNodePrev->next=pNode;
	m_pMsgTail=pNode;
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//得到头部的消息
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMessage::GetHeadMessage(STMessage*pMsg)
{
	if(pMsg)
	{
		if(m_pMsgHead)
		{
			*pMsg=m_pMsgHead->msg;
			return true;
		}
	}
	return false;
}
////////////////////////////////////////////////////////////////////////////////////////////
//清除所有消息
////////////////////////////////////////////////////////////////////////////////////////////
void CMessage::ClearAllMessage()
{
	STMessageNode*pTemp=m_pMsgHead;
	while(m_pMsgHead)
	{
		pTemp=m_pMsgHead->next;
		delete m_pMsgHead;
		m_pMsgHead=pTemp;
	}
	m_pMsgTail=NULL;
	m_nMsgCount=0;
}
////////////////////////////////////////////////////////////////////////////////////////////
//执行消息队列中的消息
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMessage::ExecuteMessage()
{
	if(!m_pMsgHead)
		return true;
	if(!m_pMsgHead->next)
	{
		if(RunMessage(m_pMsgHead->msg)==false)
		{
			delete m_pMsgHead;
			m_nMsgCount=0;
			m_pMsgTail=NULL;
			m_pMsgHead=NULL;
		}
		return true;
	}

	STMessage msg;
	
	STMessageNode*pNodePrev=m_pMsgHead;
	STMessageNode*pTemp=m_pMsgHead;
	STMessageNode*pTempDelete;
  	while(pTemp)
	{
 
		msg=pTemp->msg;
		if(RunMessage(msg)==false)										//如果此消息已经可以删除
		{
			m_nMsgCount--;
			pTempDelete=pTemp;
			
			
			if(pTemp==m_pMsgHead)										//如果此节点是头
			{
				pNodePrev=m_pMsgHead->next;	
				m_pMsgHead=m_pMsgHead->next;							//修改头指针
											
				pTemp=pTemp->next;
			}
			else if(pTemp==m_pMsgHead->next)							//如果此节点是头节点next指向的
			{
				m_pMsgHead->next=pTemp->next;
				pNodePrev=m_pMsgHead;
				pTemp=pTemp->next;
			}
			else
			{
				pTemp=pTemp->next;
				pNodePrev->next=pTemp;	
			}
			if(pTempDelete->msg.dwNewFlag & LOA_MSG_NEW_CPARAM_P)
			{
				delete pTempDelete->msg.cParam;
			}
			else if(pTempDelete->msg.dwNewFlag & LOA_MSG_NEW_CPARAM_A)
			{
				delete [] pTempDelete->msg.cParam;
			}
			if(pTempDelete->msg.dwNewFlag & LOA_MSG_NEW_P1PARAM_P)
			{
				delete pTempDelete->msg.pParam1;
			}
			else if(pTempDelete->msg.dwNewFlag & LOA_MSG_NEW_P1PARAM_A)
			{
				delete [] pTempDelete->msg.pParam1;
			}
			if(pTempDelete->msg.dwNewFlag & LOA_MSG_NEW_P2PARAM_P)
			{
				delete pTempDelete->msg.pParam2;
			}
			else if(pTempDelete->msg.dwNewFlag & LOA_MSG_NEW_P2PARAM_A)
			{
				delete [] pTempDelete->msg.pParam2;
			}
			delete pTempDelete;
		}
		else
		{
			pNodePrev=pTemp;
			pTemp=pTemp->next;
		}	
	}
	m_pMsgTail=pNodePrev;
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//得到消息个数
////////////////////////////////////////////////////////////////////////////////////////////
DWORD CMessage::GetMessageCount()
{
	return m_nMsgCount;
}
////////////////////////////////////////////////////////////////////////////////////////////
//执行一条消息,如果执行完成后要求从队列中删除此消息,返回false,否则返回true
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMessage::RunMessage(const STMessage &msg)
{
	switch(msg.ID)
	{
	case LOA_MSG_QUIT:
		((CGame*)msg.cParam)->QuitGame((int)msg.pParam1);
		return false;
		break;
	case LOA_MSG_SHOWMAGIC:
		{
			STMagic*pMagic;
			if(((CGame*)msg.cParam)->GetMagicDataBase()->FindData((int)msg.pParam1,&pMagic))
			{
 				CMagic*mgc=new CMagic();
				mgc->ShowMagic((CGame*)msg.cParam,pMagic,LOA_GET_POINT_X((int)msg.pParam2),LOA_GET_POINT_Y((int)msg.pParam2),0);
			}
			return false;
		}
		break;
	case LOA_MSG_SHOW_TALK_DOWN:
		{
			CTalk talk;
			talk.AddTalk((char*)msg.pParam2);
			talk.ShowTalk((STRenderRole*)msg.pParam1,(CGame*)msg.cParam,true);
			return false;
		}
		break;
	case LOA_MSG_SHOW_TALK_UP:
		{
			CTalk talk;
			talk.AddTalk((char*)msg.pParam2);
			talk.ShowTalk((STRenderRole*)msg.pParam1,(CGame*)msg.cParam,false);
			return false;
		}
		break;
	case LOA_MSG_SHOW_MESSAGE:
		{
			CTalk talk;
			talk.ShowMessage((CGame*)msg.cParam,
							(char*)msg.pParam2,
							(DWORD)msg.pParam1,
							250,220,NULL,
							RGB(255,255,255),RGB(0,0,0),
							16,20,false);
			return false;
		}
	case LOA_MSG_SET_ROLE_DIR:
		{
			((CGame*)msg.cParam)->GetPlayer()->pRole->SetDirection((int)msg.pParam2);
			return false;
		}
		break;
	case LOA_MSG_LOADSCRIPT:
		{
			CScript script;
			script.ExecuteScript((CGame*)msg.cParam,((CGame*)msg.cParam)->GetLog(),
								 ((CGame*)msg.cParam)->GetScriptData(),(char*)msg.pParam1);
			return false;
		}
		break;
	case LOA_MSG_PLAYMEDIA:
		{
			((CGame*)msg.cParam)->PlayMedia((char*)msg.pParam1,(BOOL)msg.pParam2);
			return false;
		}
		break;
	default:
		return false;
	}
}

⌨️ 快捷键说明

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