무협 세계 클라이언트 소스 코드[정적 변수의 초기화 2]

34747 단어 정적 변수
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;
}

좋은 웹페이지 즐겨찾기