• <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>

            天行健 君子當自強而不息

            創建游戲內核(3)


            本篇是的 創建游戲內核(2)續篇,并且以 游戲程序流、狀態處理機、進程管理器、數據包系統的實現中介紹的進程管理器的實現為基礎。

            棧上的每個函數在每幀都要被調用,除了這點小的不同之處,PROCESS_MANAGER和STATE_MANAGER非常相似。

            以下是該類的定義:

            //==========================================================================
            // 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);
            };

            接著是它的實現:
             
            //-----------------------------------------------------------------------------
            // 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;
                }
            }
             

            下面給出測試代碼:

            點擊下載源碼和工程

             
            /*****************************************************************************
            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();
            }

            運行截圖:



             

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

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久精品极品盛宴观看| 久久综合狠狠色综合伊人| 久久人人爽爽爽人久久久| 久久精品嫩草影院| 性欧美大战久久久久久久久| 久久国产成人| 一本色道久久88加勒比—综合| 久久精品国产色蜜蜜麻豆| 婷婷久久综合| 日韩欧美亚洲综合久久影院Ds| 97精品国产97久久久久久免费| 精品人妻伦九区久久AAA片69| 午夜不卡久久精品无码免费| 国产香蕉97碰碰久久人人| 无码国内精品久久人妻| 久久中文字幕视频、最近更新| 青春久久| 久久久九九有精品国产| 伊人久久成人成综合网222| 性高朝久久久久久久久久| 久久久精品午夜免费不卡| 亚洲狠狠婷婷综合久久蜜芽| 欧美伊人久久大香线蕉综合69| 精品久久久久中文字幕日本| 91精品国产91久久久久久青草| 香蕉久久夜色精品国产尤物| 国产一区二区精品久久凹凸 | 国产成人综合久久精品尤物| 久久播电影网| 88久久精品无码一区二区毛片| 国产精品久久久久AV福利动漫| 国产偷久久久精品专区| 性欧美大战久久久久久久| 久久人做人爽一区二区三区| 亚洲欧美久久久久9999| 囯产精品久久久久久久久蜜桃| 色欲综合久久中文字幕网| 亚洲精品美女久久久久99| 亚洲AV日韩AV天堂久久| 久久精品国产亚洲AV蜜臀色欲| 久久综合久久自在自线精品自|