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

📄 rpgmain.cc

📁 五行MMORPG引擎系统V1.0
💻 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 + -