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

            天行健 君子當自強而不息

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


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


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評論

            2021最新久久久视精品爱| 国内高清久久久久久| 久久婷婷五月综合色奶水99啪 | 日本免费久久久久久久网站| 欧美大香线蕉线伊人久久| 国内精品人妻无码久久久影院| 亚洲精品无码成人片久久| 99久久精品国产综合一区| 精品久久国产一区二区三区香蕉| 久久亚洲国产中v天仙www| 久久人人爽人人爽人人av东京热 | 亚洲欧美精品一区久久中文字幕| 99久久婷婷免费国产综合精品| 久久精品国产精品国产精品污 | 久久精品成人影院| 久久香蕉超碰97国产精品| 久久AⅤ人妻少妇嫩草影院| 一本久道久久综合狠狠爱| 久久婷婷人人澡人人| 国产精品激情综合久久| 亚洲精品乱码久久久久久按摩| 亚洲一区中文字幕久久| 久久99精品久久只有精品 | 精品久久综合1区2区3区激情| 久久久久久久亚洲Av无码| 久久亚洲中文字幕精品有坂深雪| 久久久综合香蕉尹人综合网| 久久涩综合| 亚洲精品白浆高清久久久久久| 99久久精品免费看国产一区二区三区| 亚洲国产成人精品女人久久久 | 国产国产成人精品久久| 久久精品人人做人人妻人人玩| 狠狠色丁香久久婷婷综合五月| 人妻丰满AV无码久久不卡| 久久精品中文騷妇女内射| 国产A级毛片久久久精品毛片| 一本久久精品一区二区| 97久久天天综合色天天综合色hd| 久久996热精品xxxx| 久久一日本道色综合久久|