• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當(dāng)自強(qiáng)而不息

            創(chuàng)建游戲內(nèi)核(3)


            本篇是的 創(chuàng)建游戲內(nèi)核(2)續(xù)篇,并且以 游戲程序流、狀態(tài)處理機(jī)、進(jìn)程管理器、數(shù)據(jù)包系統(tǒng)的實(shí)現(xiàn)中介紹的進(jìn)程管理器的實(shí)現(xiàn)為基礎(chǔ)。

            棧上的每個(gè)函數(shù)在每幀都要被調(diào)用,除了這點(diǎn)小的不同之處,PROCESS_MANAGER和STATE_MANAGER非常相似。

            以下是該類(lèi)的定義:

            //==========================================================================
            // Defines for process manager.
            //==========================================================================
            class PROCESS_MANAGER
            {
            private:
                
            struct PROCESS
                {
                    FUNC_PTR func;
                    PROCESS* next;

                    PROCESS()
                    {
                        func = NULL;
                        next = NULL;
                    }

                    ~PROCESS()
                    {
                        delete next;
                        next = NULL;
                    }
                };

            protected:
                PROCESS* _process_parent;

            public:
                PROCESS_MANAGER();
                ~PROCESS_MANAGER();

                
            void Push(FUNC_PTR func, void* data_ptr = NULL);
                BOOL Pop(
            void* data_ptr = NULL);
                
            void Pop_All(void* data_ptr = NULL);
                
            void Process(void* data_ptr = NULL);
            };

            接著是它的實(shí)現(xiàn):
             
            //-----------------------------------------------------------------------------
            // Constructor.
            //-----------------------------------------------------------------------------
            PROCESS_MANAGER::PROCESS_MANAGER()
            {
                _process_parent = NULL;
            }

            //-----------------------------------------------------------------------------
            // Destructor, pop all functions.
            //-----------------------------------------------------------------------------
            PROCESS_MANAGER::~PROCESS_MANAGER()
            {
                
            // pop each process
                while(Pop() == TRUE)
                    ;
            }

            //-----------------------------------------------------------------------------
            // Push a function on to the stack
            //-----------------------------------------------------------------------------
            void PROCESS_MANAGER::Push(FUNC_PTR func, void* data_ptr)
            {
                
            // don't push a NULL value
                if(func != NULL)
                {
                    
            // allocate a new process and push it on stack
                    PROCESS* process_ptr = new PROCESS();

                    process_ptr->func = func;
                    process_ptr->next = _process_parent;

                    _process_parent = process_ptr;

                    
            // call process with init purpose
                    process_ptr->func(data_ptr, INIT_PURPOSE);
                }
            }

            //-----------------------------------------------------------------------------
            // Pop top process from stack
            //-----------------------------------------------------------------------------
            BOOL PROCESS_MANAGER::Pop(void* data_ptr)
            {
                PROCESS*  process_ptr;

                
            // remove the head of stack (if any)
                if((process_ptr = _process_parent) != NULL)
                {
                    
            // first call with shutdown purpose
                    _process_parent->func(data_ptr, SHUTDOWN_PURPOSE);

                    _process_parent   = process_ptr->next;
                    process_ptr->next = NULL;

                    delete process_ptr;
                }

                
            // return TRUE if more processes exist, FALSE otherwise
                return (_process_parent != NULL);
            }

            //-----------------------------------------------------------------------------
            // Pop all process.
            //-----------------------------------------------------------------------------
            void PROCESS_MANAGER::Pop_All(void* data_ptr)
            {
                
            while(Pop(data_ptr) == TRUE)
                    ;
            }

            //-----------------------------------------------------------------------------
            // Process all functions
            //-----------------------------------------------------------------------------
            void PROCESS_MANAGER::Process(void* data_ptr)
            {
                PROCESS* process_ptr = _process_parent;

                
            while(process_ptr != NULL)
                {
                    process_ptr->func(data_ptr, FRAME_PURPOSE);
                    process_ptr = process_ptr->next;
                }
            }
             

            下面給出測(cè)試代碼:

            點(diǎn)擊下載源碼和工程

             
            /*****************************************************************************
            PURPOSE:
                Test for class PROCESS_MANAGER.
            *****************************************************************************/


            #include "Core_System.h"

            #pragma warning(disable : 4996)

            class APP : public APPLICATION
            {
            private:
                PROCESS_MANAGER _process_manager;

                
            static void _Function1(void*, long);
                
            static void _Function2(void*, long);

            public:
                BOOL Init()
                {
                    _process_manager.Push(_Function1, 
            this);
                    _process_manager.Push(_Function2, 
            this);

                    
            return TRUE;
                }

                BOOL Frame()
                {
                    _process_manager.Process(
            this);
                    
                    _process_manager.Pop_All(
            this);

                    
            return TRUE;
                }
            };

            void APP::_Function1(void* data_ptr, long purpose)
            {
                APP* app_inst = (APP*) data_ptr;

                
            if(app_inst != NULL)
                {
                    
            if(purpose == INIT_PURPOSE)
                        MessageBox(app_inst->Get_Hwnd(), "Process1 - init", "Message", MB_OK);
                    
            else if(purpose == FRAME_PURPOSE)
                        MessageBox(app_inst->Get_Hwnd(), "Process1 - frame", "Message", MB_OK);
                    
            else if(purpose == SHUTDOWN_PURPOSE)
                        MessageBox(app_inst->Get_Hwnd(), "Process1 - shutdown", "Message", MB_OK);
                }
            }

            void APP::_Function2(void* data_ptr, long purpose)
            {   
                APP* app_inst = (APP*) data_ptr;

                
            if(app_inst != NULL)
                {
                    
            if(purpose == INIT_PURPOSE)
                        MessageBox(app_inst->Get_Hwnd(), "Process2 - init", "Message", MB_OK);
                    
            else if(purpose == FRAME_PURPOSE)
                        MessageBox(app_inst->Get_Hwnd(), "Process2 - frame", "Message", MB_OK);
                    
            else if(purpose == SHUTDOWN_PURPOSE)
                        MessageBox(app_inst->Get_Hwnd(), "Process2 - shutdown", "Message", MB_OK);
                }    
            }

            int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                APP app;

                
            return app.Run();
            }

            運(yùn)行截圖:



             

            posted on 2007-08-26 00:29 lovedday 閱讀(451) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(lèi)(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            国产精品亚洲综合久久| 青青青青久久精品国产| 一级做a爰片久久毛片人呢| 99国内精品久久久久久久| 久久se精品一区二区| 久久国产成人| 中文字幕久久精品无码| 国产成人久久激情91| 久久影视综合亚洲| 精品蜜臀久久久久99网站| 一本色道久久综合狠狠躁篇| 久久精品九九亚洲精品天堂| 欧美亚洲另类久久综合婷婷| 99久久精品国产麻豆| 久久99热这里只有精品66| 国产精品美女久久久久| 久久精品国产精品亚洲下载| 久久精品亚洲福利| 欧美日韩精品久久久久| 国产99久久久国产精免费| 99国产精品久久| 亚洲精品成人久久久| 亚洲狠狠综合久久| 无码AV波多野结衣久久| 亚洲中文字幕无码久久2020| 99热热久久这里只有精品68| 91视频国产91久久久| 久久精品国产99久久久古代| 久久久无码精品亚洲日韩京东传媒| 久久综合九色综合久99| 国产成人综合久久综合| 亚洲AV无码一区东京热久久| 亚洲AV伊人久久青青草原| 久久九九久精品国产| 久久一本综合| 日本加勒比久久精品| 国产成人无码精品久久久免费| 国产精品伊人久久伊人电影| 大蕉久久伊人中文字幕| 精品久久久久久国产| 伊人久久综在合线亚洲2019|