• <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 閱讀(449) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            精品一区二区久久久久久久网站| 久久99精品久久久久久hb无码| 久久99精品久久久久久噜噜| 久久天天躁狠狠躁夜夜不卡| 久久夜色精品国产亚洲| …久久精品99久久香蕉国产| 九九久久精品无码专区| 99精品国产综合久久久久五月天| 999久久久免费精品国产| 久久婷婷色综合一区二区| 精品蜜臀久久久久99网站| 日本久久中文字幕| 久久99精品国产麻豆宅宅| 国产精品久久久久a影院| 精品无码人妻久久久久久| 久久精品夜夜夜夜夜久久| 久久综合久久综合亚洲| 久久高潮一级毛片免费| 久久精品国产亚洲AV麻豆网站 | 精品一久久香蕉国产线看播放| 一本色道久久88综合日韩精品| 狠狠色婷婷综合天天久久丁香 | 人人狠狠综合久久亚洲婷婷| 亚洲乱码精品久久久久..| 日本久久中文字幕| 精品久久人人做人人爽综合| 丰满少妇人妻久久久久久| 亚洲精品国产字幕久久不卡| 久久天天躁狠狠躁夜夜2020一| 久久久免费观成人影院 | 亚洲日本va中文字幕久久| 久久久久久久综合日本| 久久精品国内一区二区三区 | 欧美国产成人久久精品| 色天使久久综合网天天 | 中文无码久久精品| 久久久久青草线蕉综合超碰| 亚洲天堂久久久| 国内精品久久久久影院薰衣草| 久久精品国产AV一区二区三区| 一级女性全黄久久生活片免费|