📄 rpgmain.cc
字号:
/// TGE_RPGClient2 增加RPGGame接口管理
//-----------------------------------------------------------------------------
// 李亦
// 2006.5.31
//-----------------------------------------------------------------------------
#include "platform/platform.h"
#include "platform/event.h"
//#include "platform/gameInterface.h"
#include "gui/core/guiCanvas.h"
#include "sim/actionMap.h"
#include "game/game.h"
#include "console/telnetConsole.h"
#include "console/telnetDebugger.h"
#include "platform/profiler.h"
#include "game/shapeBase.h"
#include "sim/netInterface.h"
//#include "game/net/serverQuery.h"
#include "game/RPGGame.h"
#ifdef TGE_RPG /// TGE_Map
#include "game/WorldWall.h"//
#include "rpg/RPGEngine.h"
#endif
//#ifndef BUILD_TOOLS
//#ifdef TGE_RPGCLIENT2 /// TGE_RPGClient2 在app/appClient中实现
//RPGGame GameObject;
//DemoNetInterface GameNetInterface;
//#endif
//#endif
/// TGE_TerrainScene
extern ResourceInstance *constructTerrainScene(Stream &stream);
extern ResourceInstance *constructTerrainFile(Stream &stream);
extern ResourceInstance *constructTSShape(Stream &);
extern void netInit();
extern void processConnectedReceiveEvent( ConnectedReceiveEvent * event );
extern void processConnectedNotifyEvent( ConnectedNotifyEvent * event );
extern void processConnectedAcceptEvent( ConnectedAcceptEvent * event );
extern void ShowInit();
extern /*static */bool initLibraries();
extern/*static*/ void shutdownLibraries();
static F32 gTimeScale = 1.0;
static U32 gTimeAdvance = 0;
static U32 gFrameSkip = 0;
static U32 gFrameCount = 0;
// Executes an entry script; can be controlled by command-line options.
extern bool runEntryScript (int argc, const char **argv);
/// Initalize game, run the specified startup script
extern bool initGame(int argc, const char **argv);
/// Shutdown the game and delete core objects
extern void shutdownGame();
extern bool gDGLRender;
bool gShuttingDown = false;
/// Main loop of the game
int RPGGame::main(int argc, const char **argv)
{
if(!initLibraries())
return 0;
// Set up the command line args for the console scripts...
Con::setIntVariable("Game::argc", argc);
U32 i;
for (i = 0; i < argc; i++)
Con::setVariable(avar("Game::argv%d", i), argv[i]);
if (initGame(argc, argv) == false)
{
Platform::AlertOK("Error", "Failed to initialize game, shutting down.");
shutdownGame();
shutdownLibraries();
gShuttingDown = true;
return 0;
}
while(Game->isRunning())
{
PROFILE_START(MainLoop);
PROFILE_START(JournalMain);
Game->journalProcess();
PROFILE_END();
#ifndef TGE_RPG
PROFILE_START(NetProcessMain);
Net::process(); // read in all events
PROFILE_END();
#endif
PROFILE_START(PlatformProcessMain);
Platform::process(); // keys, etc.
PROFILE_END();
PROFILE_START(TelconsoleProcessMain);
TelConsole->process();
PROFILE_END();
PROFILE_START(TelDebuggerProcessMain);
TelDebugger->process();
PROFILE_END();
#ifdef TGE_RPG
PROFILE_START(RPGEngineProcessMain);
RPG::RPGEngine::Process();
PROFILE_END();
#endif
PROFILE_START(TimeManagerProcessMain);
TimeManager::process(); // guaranteed to produce an event
PROFILE_END();
PROFILE_END();
}
shutdownGame();
shutdownLibraries();
gShuttingDown = true;
return 0;
}
//--------------------------------------
/// Resets the FPS variables
extern void fpsReset();
//--------------------------------------
/// Updates the FPS variables
extern void fpsUpdate();
/// Process a mouse movement event, essentially pass to the canvas for handling
void RPGGame::processMouseMoveEvent(MouseMoveEvent * mEvent)
{
if (Canvas)
Canvas->processMouseMoveEvent(mEvent);
}
/// Process an input event, pass to canvas for handling
void RPGGame::processInputEvent(InputEvent *event)
{
PROFILE_START(ProcessInputEvent);
if (!ActionMap::handleEventGlobal(event))
{
// Other input consumers here...
if (!(Canvas && Canvas->processInputEvent(event)))
ActionMap::handleEvent(event);
}
PROFILE_END();
}
/// Process a quit event
void RPGGame::processQuitEvent()
{
setRunning(false);
}
/// Refresh the game window, ask the canvas to set all regions to dirty (need to be updated)
void RPGGame::refreshWindow()
{
if(Canvas)
Canvas->resetUpdateRegions();
}
/// Process a console event
void RPGGame::processConsoleEvent(ConsoleEvent *event)
{
char *argv[2];
argv[0] = "eval";
argv[1] = event->data;
Sim::postCurrentEvent(Sim::getRootGroup(), new SimConsoleEvent(2, const_cast<const char**>(argv), false));
}
/// Process a time event and update all sub-processes
void RPGGame::processTimeEvent(TimeEvent *event)
{
PROFILE_START(ProcessTimeEvent);
U32 timeDelta;
bool tickPass;
U32 elapsedTime = event->elapsedTime;
///////////////////////////////////////////////////////////
//计算每秒流逝
static U32 snNetTimer = 0;
BOOL bSecHappended = FALSE;
U32 nTimer = Platform::getVirtualMilliseconds();
if(nTimer - snNetTimer >= 1000)
{
bSecHappended = TRUE;
snNetTimer = nTimer;
}
////////////////////////////////////////////////////////////
//计算每Tick流逝
// cap the elapsed time to one second
// if it's more than that we're probably in a bad catch-up situation
if(elapsedTime > 1024)
elapsedTime = 1024;
if(gTimeAdvance)
timeDelta = gTimeAdvance;
else
timeDelta = (U32) (elapsedTime * gTimeScale);
/// 系统时间步进处理
Platform::advanceTime(elapsedTime);
///////////////////////////////////
// Server Client公共逻辑
//处理RPGProcess的Tick逻辑
PROFILE_START(RPGProcess);
tickPass = RPGProcess(timeDelta);
PROFILE_END();
////////////////////////////////////////
/// Sim引擎时间步进处理
PROFILE_START(SimAdvanceTime);
Sim::advanceTime(timeDelta);
PROFILE_END();
////////////////////////////////////////
//服务端逻辑处理
#ifdef TGE_RPGSERVER
PROFILE_START(ServerProcess);
tickPass = serverProcess(timeDelta);
PROFILE_END();
PROFILE_START(ServerNetProcess);
//逢秒处理网络事件
if(bSecHappended)
GNet->processServer();
PROFILE_END();
#endif
/////////////////////////////////////////
///客户端逻辑处理
#ifdef TGE_RPGCLIENT
PROFILE_START(ClientProcess);
tickPass = clientProcess(timeDelta);
PROFILE_END();
//逢秒处理网络事件
PROFILE_START(ClientNetProcess);
if(bSecHappended)
GNet->processClient();
PROFILE_END();
//////////////////////////////////////////
/// 帧渲染
if(Canvas && gDGLRender)
{
bool preRenderOnly = false;
if(gFrameSkip && gFrameCount % gFrameSkip)
preRenderOnly = true;
PROFILE_START(RenderFrame);
ShapeBase::incRenderFrame();
Canvas->renderFrame(preRenderOnly);
PROFILE_END();
gFrameCount++;
}
#endif
/// 网络超时检测
GNet->checkTimeouts();
fpsUpdate();
PROFILE_END();
// Update the console time
Con::setFloatVariable("Sim::Time",F32(Platform::getVirtualMilliseconds()) / 1000);
}
/// Re-activate the game from, say, a minimized state
extern void GameReactivate();
/// De-activate the game in responce to, say, a minimize event
extern void GameDeactivate( bool noRender );
/// Invalidate all the textures
void RPGGame::textureKill()
{
TextureManager::makeZombie();
}
/// Reaquire all textures
void RPGGame::textureResurrect()
{
TextureManager::resurrect();
}
/// Process recieved net-packets
void RPGGame::processPacketReceiveEvent(PacketReceiveEvent * prEvent)
{
GNet->processPacketReceiveEvent(prEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -