📄 rpgprocess.cc
字号:
//RPGProcess.cc
/*/////////////////////////////////////////////////////////////////
李亦
liease@163.com 4040719
2006-7-17
/*/////////////////////////////////////////////////////////////////
#include "core/dnet.h"
#include "game/gameConnection.h"
#include "game/shapeBase.h"
#include "platform/profiler.h"
#include "console/consoleTypes.h"
#include "rpg/RPGProcess.h"
#include "rpg/cmd/RPGCommand.h"
namespace RPG
{
//----------------------------------------------------------------------------
RPGProcess g_RPGProcess;
//bool RPGProcess::mDebugControlSync = false;
RPGProcess::RPGProcess()
{
m_bDirty = false;
m_dwSequence = 0;
m_dwLastTick = 0;
m_dwLastTime = 0;
m_dwLastDelta = 0;
//mIsServer = isServer;
// Con::addVariable("debugControlSync",TypeBool, &mDebugControlSync);
}
//----------------------------------------------------------------------------
void RPGProcess::orderList()
{
m_dwSequence++;
// Install a temporary m_listHeader node
RPGBase list;
list.PLLinkBefore(m_listHeader.m_pLinkNext);
m_listHeader.PLUnlink();
// Reverse topological sort into the orignal m_listHeader node
while (list.m_pLinkNext != &list)
{
RPGBase* ptr = list.m_pLinkNext;
ptr->m_uSequence = m_dwSequence;
ptr->PLUnlink();
if (ptr->m_objectPtrAfter)
{
// Build chain "stack" of dependant objects and patch
// it to the end of the current list.
while (bool(ptr->m_objectPtrAfter) &&
ptr->m_objectPtrAfter->m_uSequence != m_dwSequence)
{
ptr->m_objectPtrAfter->m_uSequence = m_dwSequence;
ptr->m_objectPtrAfter->PLUnlink();
ptr->m_objectPtrAfter->PLLinkBefore(ptr);
ptr = ptr->m_objectPtrAfter;
}
ptr->PLJoin(&m_listHeader);
}
else
ptr->PLLinkBefore(&m_listHeader);
}
m_bDirty = false;
}
//----------------------------------------------------------------------------
//bool RPGProcess::advanceServerTime(SimTime timeDelta)
//{
// PROFILE_START(AdvanceServerTime);
//
// ///去除Server端的所有ProcessTick处理
////#ifndef TGE_RPGCLIENT /// TGE_RPGClientCtrl
// if (m_bDirty)
// orderList();
////#endif
//
// SimTime targetTime = m_dwLastTime + timeDelta;
// SimTime targetTick = targetTime & ~TICK_MASK;
// SimTime tickCount = (targetTick - m_dwLastTick) >> TICK_SHIFT;
//
// bool bRet = m_dwLastTick != targetTick;
//
//
////#ifndef TGE_RPGCLIENT /// TGE_RPGClientCtrl
// // Advance all the objects
// for (; m_dwLastTick != targetTick; m_dwLastTick += TICK_LEN_MS)
// advanceObjects();
//
// // Credit all the connections with the elapsed ticks.
// //SimGroup *g = Sim::getClientGroup();
// //for (SimGroup::iterator i = g->begin(); i != g->end(); i++)
// // if (GameConnection *t = dynamic_cast<GameConnection *>(*i))
// // t->incMoveCredit(tickCount);
////#endif
//
// m_dwLastTime = targetTime;
// PROFILE_END();
// return bRet;
//}
//----------------------------------------------------------------------------
bool RPGProcess::AdvanceTime(SimTime timeDelta)
{
PROFILE_START(RPGProcessAdvanceTime);
if(g_pRPGCommand)
g_pRPGCommand->AdvanceTime(timeDelta);
if (m_bDirty)
orderList();
RPGBase* obj;
F32 dt;
SimTime targetTime = m_dwLastTime + timeDelta;
SimTime targetTick = (targetTime + TICK_MASK) & ~TICK_MASK;
SimTime tickCount = (targetTick - m_dwLastTick) >> TICK_SHIFT;
if (tickCount)
{
////////////////////////////////////////////////////
//在进行Tick步进前,需要进行Tick复位
if (m_dwLastDelta)
{
obj = m_listHeader.m_pLinkNext;
for (; obj != &m_listHeader; obj = obj->m_pLinkNext)
{
if (obj->m_bProcessTick)
obj->InterpolateTick(0);
}
}
/////////////////////////////////////////////////////////////////
//进行多个Tick步进运算
for (;m_dwLastTick != targetTick; m_dwLastTick += TICK_LEN_MS)
{
advanceObjects();
}
}
///////////////////////////////////////////////////////////////////
//进行Tick插值运算,对targetTime取Tick模尾数的补数插值
m_dwLastDelta = (TICK_LEN_MS - (targetTime & TICK_MASK)) & TICK_MASK;
dt = m_dwLastDelta / F32(TICK_LEN_MS); /// 换算0-1比率
obj = m_listHeader.m_pLinkNext;
for (; obj != &m_listHeader; obj = obj->m_pLinkNext)
{
if (obj->m_bProcessTick)
obj->InterpolateTick(dt);
}
////////////////////////////////////////////////////////////////////
//以秒为参考,进行时间步进
dt = F32(timeDelta) / 1000.f;
obj = m_listHeader.m_pLinkNext;
for (; obj != &m_listHeader; obj = obj->m_pLinkNext)
{
obj->AdvanceTime(dt);
}
m_dwLastTime = targetTime;
PROFILE_END();
return tickCount != 0;
}
//----------------------------------------------------------------------------
void RPGProcess::advanceObjects()
{
PROFILE_START(RPGProcessAdvanceObjects);
// A little link list shuffling is done here to avoid problems
// with objects being deleted from within the process method.
RPGBase list;
RPGBase* obj;
list.PLLinkBefore(m_listHeader.m_pLinkNext);
m_listHeader.PLUnlink();
while ((obj = list.m_pLinkNext) != &list)
{
obj->PLUnlink();
obj->PLLinkBefore(&m_listHeader);
// Each object is either advanced a single tick, or if it's
// being controlled by a client, ticked once for each pending move.
if ((obj->mTypeMask & RPGBaseObjectType) != RPGBaseObjectType)
continue;
//{
// RPGBase *pGB = static_cast<RPGBase *>(obj);
// GameConnection* con = pGB->GetControllingClient();
// if (con && con->getControlObject() == pGB)
// {
// Move* movePtr;
// U32 m, numMoves;
// con->getMoveList(&movePtr, &numMoves);
// for (m = 0; m < numMoves && pGB->GetControllingClient() == con; m++)
// obj->ProcessTick(&movePtr[m]);
// con->clearMoves(m);
// continue;
// }
//}
if (obj->m_bProcessTick)
obj->ProcessTick(0);
}
PROFILE_END();
}
};//namespace RPG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -