무협 세계 클라이언트 소스 코드[정적 변수의 초기화 2]
VOID CGameProcedure::InitStaticMemeber(VOID)
{
...//
//
//g_theKernel.LoadPlugin(_T("Debuger.dll"), &g_theKernel);
g_theKernel.LoadPlugin(_T("WXRender.dll"), &g_theKernel);
g_theKernel.LoadPlugin(_T("UISystem.dll"), &g_theKernel);
//
s_pProcLogIn = new CGamePro_Login(); //
s_pProcCharSel = new CGamePro_CharSel(); //
s_pProcCharCreate = new CGamePro_CharCreate(); //
s_pProcEnter = new CGamePro_Enter(); //
s_pProcMain = new CGamePro_Main(); //
s_pProcChangeScene = new CGamePro_ChangeScene(); //
//
//0.
s_pInputSystem = (tInputSystem*) g_theKernel.NewNode(_T("CInputSystem"), _T("bin"), _T("input"));
//1.
s_pTimeSystem = (tTimeSystem*) g_theKernel.NewNode(_T("tTimeSystem"), _T("bin"), _T("time"));
//2.
s_pNetManager = (CNetManager*) g_theKernel.NewNode(_T("CNetManager"), _T("bin"), _T("netman"));
//3.
s_pSoundSystem = (tSoundSystem*) g_theKernel.NewNode(_T("CSoundSystemFMod"), _T("bin"), _T("snd"));
//4.
s_pGfxSystem = (CRenderSystem*) g_theKernel.NewNode(_T("CRenderSystem"), _T("bin"), _T("gfx"));
//5.
// s_pDebuger = (tDebuger*) g_theKernel.NewNode(_T("TDDebuger"), _T("bin"), _T("debuger"));
//6.
s_pObjectManager= (tObjectSystem*) g_theKernel.NewNode(_T("CObjectManager"), _T("bin"), _T("objman"));
//7. UI
s_pUISystem = (tUISystem*) g_theKernel.NewNode(_T("CUISystem"), _T("bin"), _T("ui_"));
//8.
s_pWorldManager = (tWorldSystem*) g_theKernel.NewNode(_T("CWorldManager"), _T("bin"), _T("worldman"));
//9.
s_pDataBaseSystem = (tDataBaseSystem*) g_theKernel.NewNode(_T("CDataBaseSystem"), _T("bin"), _T("dbc"));
//10.
s_pVariableSystem = (tVariableSystem*) g_theKernel.NewNode(_T("CVariableSystem"), _T("bin"), _T("var"));
//11.
s_pGameInterface = ( tGameInterfaceBase* ) g_theKernel.NewNode( _T("CGameInterface"), _T("bin"), _T("interface"));
//12. UI
s_pDataPool = ( tDataPool* ) g_theKernel.NewNode( _T( "CUIDataPool" ), _T( "bin" ), _T( "datapool" ) );
s_pDataPool_ = ( tDataPool_* ) g_theKernel.NewNode( _T( "CDataPool" ), _T( "bin" ), _T( "datapool_" ) );
//13.
s_pCursorMng = ( tCursorSystem* ) g_theKernel.NewNode( _T( "CCursorMng"), _T( "bin" ), _T("cursor" ) );
//14.
s_pScriptSystem = ( tScriptSystem* ) g_theKernel.NewNode( _T( "CScriptSystem"), _T( "bin" ), _T("script" ) );
//15.
s_pEventSystem = ( tEventSystem* ) g_theKernel.NewNode( _T( "CEventSystem"), _T( "bin" ), _T("event" ) );
//16.
s_pActionSystem = ( tActionSystem* ) g_theKernel.NewNode( _T( "CActionSystem"), _T( "bin" ), _T("action" ) );
//17. UI
s_pFakeObjSystem = ( tFakeObjSystem* ) g_theKernel.NewNode( _T( "CFakeObjSystem"), _T( "bin" ), _T("fake" ) );
//18.
s_pHelperSystem = ( tHelperSystem* ) g_theKernel.NewNode( _T( "CHelperSystem"), _T( "bin" ), _T("helper" ) );
//19.
s_pResourceProvider = ( CResourceProvider* ) g_theKernel.NewNode( _T( "CResourceProvider"), _T( "bin" ), _T("resprovider" ) );
...//
CGameProcedure::InitStaticMemeber 이 부분 코드는 세 가지 일을 했습니다.
1. 플러그인을 로드하고 적법성을 확인합니다. 2.게임의 각 과정 유형을 만들고 초기화하는 실례 3.데이터 코어 초기화
플러그인의 불러오는 것은 dll을 불러와서 합법적인 플러그인인지 확인하는 것입니다.코드는 이해하기 쉬워서 보지 않겠다.프로세스 실례의 초기화는 게임의 운행에 따라 상응하는 과정을 독차지할 때 다시 본다.여기서 우리는 주로 데이터 핵심의 초기화를 본다.
데이터 핵심의 초기화는 클래스 트리를 만드는 것입니다.g_theKernel.NewNode는 루트 노드를 루트로 하는 트리에서 지정한 위치에 새 노드를 추가하는 데 주로 사용됩니다.이것은 어떻게 클래스 노드를 만듭니까?
지난 편에서, 우리는 각 종류가 이미 클래스 검색표에 등록된 것을 보았다.클래스 검색표를 통해 클래스에 맞는 생성 함수인 CreateObject (LPCTSTR szName) 를 쉽게 얻을 수 있습니다.여기에 작은 기교가 하나 있는데,CreateObject는 TClass 클래스에서만 이루어졌는데, 왜 같은 종류의 노드를 만들 수 있습니까?TClass는 단지 각종 등록 인터페이스일 뿐입니다. 우선 그것의 구조를 살펴보겠습니다
struct /*TDENGDA_API*/ tClass
{
LPCTST szClassName; // Node
INT nObjectSize; //Node
tNode* (__stdcall* pfnCreateObject)(); // , Node
tClass* pBaseClass; //
tClass* pNextClass; //
tNode* CreateObject(LPCTSTR szName); //
};
우리는 그것이 함수 바늘이 있다는 것을 볼 수 있다.각 노드 클래스를 정의할 때, 이 바늘은 클래스마다 생성 함수를 설정합니다.(노드 클래스의 tClass 클래스 실례는 WX DECLARE DYNAMIC, WX DECLARE DYNAMIC를 통해 성명하고 실현됨)CreateObject는 이러한 함수 바늘을 통해 이루어진 통일된 생성 인터페이스입니다.
다음 연구 gtheKernel.NewNode 코드, 이 함수는 다시 불러옵니다.하나는 문자열 형식의 경로에 따라 새 노드를 만들고, 다른 하나는 부모 노드에 따라 새 노드를 만든다.두 프로세스의 차이는 많지 않습니다. 위치를 찾으면CreateObject를 호출하여 노드를 만듭니다.
//
tNode* tKernel::NewNode(LPCTSTR szClassName, LPCTSTR szPosition, LPCTSTR szNodeName)
{
TDAssert(szClassName && szPosition && szNodeName);
//
tClass *pClass = OpenClass(szClassName);
if(!pClass)
{
TDThrow(_T("(tKernel::NewNode)Can't create new Node[%s]"), szClassName);
}
std::vector< STRING > vPathSplitBuf;
TDU_ConvertStringToVector(szPosition, vPathSplitBuf, _T("\\/"));
tNode *pCurrentNode = &m_theRoot;
tNode *pFindNode = NULL;
//
for(register INT i=0; i<(INT)vPathSplitBuf.size(); i++)
{
tNode *pFindNode = pCurrentNode->LookUpChild((LPCTSTR)vPathSplitBuf[i].c_str());
if(pFindNode == NULL)
{
tNode *pNewNode = new tNode(vPathSplitBuf[i].c_str());
pCurrentNode->AddChild(pNewNode);
pFindNode = pNewNode;
}
pCurrentNode = pFindNode;
}
//
if(pCurrentNode->LookUpChild(szNodeName))
{
TDThrow(_T("(tKernel::NewNode)The Node[%s] has exist!"), szNodeName);
}
tNode *pNewNode = (tNode *)pClass->CreateObject(szNodeName);
pCurrentNode->AddChild(pNewNode);
return pNewNode;
}
이 함수는 OpenClass 열기 클래스를 먼저 호출합니다. 이른바 열기 클래스는 클래스 검색표에서 지정한 클래스의 TClass 바늘을 찾는 것입니다.그리고 TDU를 통해서...ConvertStringToVector는 경로를 "\"또는 "/"로 구분합니다. 모든 항목은 노드를 만들 부모 노드입니다.그리고 순환 중에 부모 노드가 존재하는지 확인하고 존재하지 않으면 생성합니다.마지막으로 경로의 마지막 노드를 부 노드로 하고 하위 노드에 새로 만들 노드가 있는지 확인하고 존재하지 않으면 새로 만듭니다.
부모 노드에 따라 만드는 것이 이것보다 더 간단합니다.부모 노드는 매개 변수 형식으로 전송되기 때문에, 우리는 그 하위 노드에 구축할 노드가 존재하는지 직접 검사한다. 존재하지 않으면, 만들면 끝이다.
tNode* tKernel::NewNode(LPCTSTR szClassName, tNode* pParentNode, LPCTSTR szNodeName)
{
TDAssert(szClassName && pParentNode && szNodeName);
//
tClass *pClass = OpenClass(szClassName);
if(!pClass)
{
TDThrow(_T("(tKernel::NewNode)Can't create new Node[%s]"), szClassName);
}
//
if(pParentNode->LookUpChild(szNodeName))
{
TDThrow(_T("(tKernel::NewNode)The Node[%s] has exist!"), szNodeName);
}
tNode *pNewNode = (tNode *)pClass->CreateObject(szNodeName);
pParentNode->AddChild(pNewNode);
return pNewNode;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정적 변수와 함수하나의 함수를 정의한 후 점호“.”를 통해 추가된 속성과 함수는 대상 자체를 통해 여전히 접근할 수 있지만 그 실례는 접근할 수 없다. 이런 변수와 함수는 각각 静态变量와静态函数라고 불린다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.