• <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)自強而不息

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


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

            棧上的每個函數(shù)在每幀都要被調(diào)用,除了這點小的不同之處,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);
            };

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

            下面給出測試代碼:

            點擊下載源碼和工程

             
            /*****************************************************************************
            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)  編輯 收藏 引用


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


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評論

            国产成人久久精品激情| 亚洲欧洲中文日韩久久AV乱码| 久久久久国产精品嫩草影院| 中文字幕热久久久久久久| 亚洲午夜久久久久久噜噜噜| 99久久精品影院老鸭窝| 亚洲国产成人久久综合碰| 九九精品99久久久香蕉| 久久久亚洲精品蜜桃臀| AV无码久久久久不卡网站下载| 久久精品成人一区二区三区| 色婷婷综合久久久久中文一区二区 | 色婷婷噜噜久久国产精品12p| 久久久久精品国产亚洲AV无码| 久久国产乱子精品免费女| 一97日本道伊人久久综合影院| 国产精品一区二区久久不卡| 一本一道久久a久久精品综合| 久久青青草原国产精品免费| 亚洲精品美女久久777777| 久久久久人妻精品一区三寸蜜桃| 色8久久人人97超碰香蕉987| 久久亚洲2019中文字幕| 久久福利青草精品资源站免费| 久久AV高潮AV无码AV| 免费一级欧美大片久久网| 热99re久久国超精品首页| 97精品依人久久久大香线蕉97| 亚洲午夜久久久| 久久久久亚洲精品天堂久久久久久| 国内精品久久久久影院免费| 人妻精品久久久久中文字幕一冢本| 亚洲精品tv久久久久久久久久| 久久久精品久久久久久 | 久久亚洲欧洲国产综合| 91精品国产高清久久久久久91 | 人妻无码精品久久亚瑟影视| 久久99精品久久久久久水蜜桃| 99久久精品国产一区二区三区| 婷婷综合久久狠狠色99h| 国产精品无码久久久久久|