📄 cmessage.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 + -