青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

創建游戲內核(2)


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

新的狀態管理器引入了兩個概念:調用目的以及添加一個用戶自定義的數據指針,此指針指向STATE_MANAGER中的函數。調用目的是一個狀態被調用的原因,“目的(purpose)”可以是INIT_PURPOSE(表明要使用函數,需要事先進行準備)、FRAME_PURPOSE(處理單獨的一幀)或SHUTDOWN_PURPOSE(在處理完成時釋放所有資源)。

點擊下載源碼和工程

以下是該類的定義:
 
enum PURPOSE
{
    NO_PURPOSE = 0,
    INIT_PURPOSE,
    SHUTDOWN_PURPOSE,
    FRAME_PURPOSE
};

typedef 
void (*FUNC_PTR)(void* func_ptr, long purpose);

//==========================================================================
// Defines for state manager.
//==========================================================================
class STATE_MANAGER
{
private:
    
struct STATE
    {
        FUNC_PTR func;
        STATE* next;
        
        STATE()
        {
            func = NULL;
            next = NULL;
        }

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

protected:
    STATE* _state_parent;

public:
    STATE_MANAGER();
    ~STATE_MANAGER();

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

接著是該類的實現:
 
//-----------------------------------------------------------------------------
// Constructor, initialize state pointer which pointer to parent state.
//-----------------------------------------------------------------------------
STATE_MANAGER::STATE_MANAGER()
{
    _state_parent = NULL;
}

//-----------------------------------------------------------------------------
// Destructor, pop off all functions.
//-----------------------------------------------------------------------------
STATE_MANAGER::~STATE_MANAGER()
{
    Pop_All();
}

//-----------------------------------------------------------------------------
// Push a function on to the stack.
//-----------------------------------------------------------------------------
void STATE_MANAGER::Push(FUNC_PTR func, void *data_ptr)
{    
    
// don't push a NULL value
    if(func != NULL)
    {
        
// allocate a new state and push it on stack
        STATE* state_ptr = new STATE();

        state_ptr->func = func;
        state_ptr->next = _state_parent;

        _state_parent = state_ptr;

        
// call state with init purpose
        state_ptr->func(data_ptr, INIT_PURPOSE);
    }
}

//-----------------------------------------------------------------------------
// Pop a functoin off the stack.
//-----------------------------------------------------------------------------
BOOL STATE_MANAGER::Pop(void *data_ptr)
{
    STATE* state_ptr;

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

        _state_parent   = state_ptr->next;
        state_ptr->next = NULL;

        delete state_ptr;
    }

    
// return TRUE if more states exist, FALSE otherwise.
    return (_state_parent != NULL);
}

//-----------------------------------------------------------------------------
// Pop all functions off the stack.
//-----------------------------------------------------------------------------
void STATE_MANAGER::Pop_All(void *data_ptr)
{
    
while(Pop(data_ptr) == TRUE)
        ;
}

//-----------------------------------------------------------------------------
// Process top-most function.
//-----------------------------------------------------------------------------
BOOL STATE_MANAGER::Process(void* data_ptr)
{
    
// return an error if no more states
    if(_state_parent == NULL)
        
return FALSE;

    
// procress the top-most state
    _state_parent->func(data_ptr, FRAME_PURPOSE);

    
return TRUE;
}
 

下面給出測試代碼:

注意,加上一個用戶自定義變量data_ptr是有根據的。因為在類中,必須將狀態函數聲明為靜態(否則編譯器會報錯)。因此需要傳遞一個指向狀態函數的指針,狀態函數仍然是類的一部分,因此狀態函數就可以使用指針自由地訪問類的數據(甚至是私有數據)。
 
/*****************************************************************************
PURPOSE:
    Test for class STATE_MANAGER.
*****************************************************************************/


#include "Core_System.h"

#pragma warning(disable : 4996)

class APP : public APPLICATION
{
private:
    STATE_MANAGER _state_manager;

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

public:
    BOOL Init()
    {
        _state_manager.Push(_Function1, 
this);
        
return TRUE;
    }
};

void APP::_Function1(void* data_ptr, long purpose)
{
    
// get an instance pointer to APP
    APP* app_inst = (APP*) data_ptr;

    
// if init purpose, show message box and push second function.
    if(purpose == INIT_PURPOSE)
    {
        MessageBox(app_inst->Get_Hwnd(), "State1", "Message", MB_OK);
        app_inst->_state_manager.Push(_Function2, app_inst);
        
return;
    }

    
// if frame purpose, pop off function.
    if(purpose == FRAME_PURPOSE)
        app_inst->_state_manager.Pop(app_inst);
}

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

    
if(purpose == FRAME_PURPOSE)
    {
        MessageBox(app_inst->Get_Hwnd(), "State 2", "Message", MB_OK);
        app_inst->_state_manager.Pop(app_inst);        
    }
}

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

    
return app.Run();
}

運行截圖:



閱讀下篇:創建游戲內核(3)

posted on 2007-08-25 21:29 lovedday 閱讀(564) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩一区成人| 欧美激情欧美激情在线五月| 另类尿喷潮videofree| 夜夜嗨av一区二区三区四季av | 毛片一区二区| 免费成人激情视频| 欧美成人dvd在线视频| 另类激情亚洲| 欧美人成在线视频| 欧美日韩一区二区三区在线观看免| 欧美精品乱人伦久久久久久 | 亚洲午夜黄色| 亚洲一区二区久久| 午夜精品久久久久久久男人的天堂| 亚洲影院色无极综合| 欧美在线观看www| 久久视频在线视频| 亚洲国产精品一区二区第四页av| 久久三级视频| 欧美激情一区在线| 9i看片成人免费高清| 亚洲欧美日韩一区在线| 久久国产精品一区二区三区四区| 久久欧美肥婆一二区| 欧美人与性动交cc0o| 国产精品久久久久久五月尺| 狠狠色噜噜狠狠色综合久| 亚洲国内在线| 亚洲男女自偷自拍图片另类| 久久中文在线| 99热这里只有精品8| 久久精品主播| 国产精品二区在线| 亚洲国产精品一区二区久| 亚洲新中文字幕| 蜜月aⅴ免费一区二区三区| 91久久国产综合久久91精品网站| 一本到12不卡视频在线dvd| 久久久精品国产免费观看同学 | 欧美日韩三级视频| 狠狠色综合一区二区| 亚洲欧美激情视频在线观看一区二区三区| 美女精品在线| 久久爱91午夜羞羞| 国产精品裸体一区二区三区| 亚洲免费高清视频| 欧美激情亚洲精品| 久久久久亚洲综合| 国产一区二区三区黄| 欧美日韩国产综合在线| 中文在线资源观看网站视频免费不卡 | 在线免费观看日本欧美| 国产精品久久亚洲7777| 欧美日韩国产综合一区二区| 欧美午夜精品久久久久免费视| 欧美一区亚洲| 欧美本精品男人aⅴ天堂| 欧美资源在线观看| 久久久久久久久久久久久久一区| 免费在线成人| 国产精品久久久久久久久久妞妞| 国内外成人免费激情在线视频| 亚洲国产第一页| 亚洲伊人色欲综合网| 久久精品免视看| 亚洲久久成人| 久久爱www久久做| 欧美日韩精品一区二区在线播放 | 国产精品国产一区二区| 欧美天堂在线观看| 国产精品久久久久久久久婷婷| 国产亚洲一区二区在线观看| 亚洲精一区二区三区| 欧美一区二区三区免费观看| 欧美国产专区| 午夜激情一区| 国产精品乱码| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲人成网站在线播| 激情视频亚洲| 国产日韩专区| 日韩亚洲国产精品| 免播放器亚洲一区| 午夜在线视频观看日韩17c| 欧美日韩裸体免费视频| 精品成人一区二区三区四区| 亚洲欧美日韩精品在线| 亚洲第一福利社区| 久久精品亚洲精品| 国产一区久久久| 小黄鸭精品aⅴ导航网站入口| 欧美激情一区二区三区成人| 久久久久国产免费免费| 黄色成人在线网站| 久久综合久久久| 久久视频国产精品免费视频在线 | 久久久xxx| 国产一二精品视频| 欧美一区二区精美| 亚洲视频欧美视频| 欧美日韩国产在线看| 亚洲免费不卡| 日韩亚洲综合在线| 欧美日韩国产在线看| 一本久道久久综合婷婷鲸鱼| av成人免费观看| 欧美三级视频| 亚洲欧美日韩久久精品| 亚洲视频一区二区免费在线观看| 欧美日韩国产成人精品| 宅男精品视频| 久久香蕉精品| 久久久精品日韩| 伊人天天综合| 亚洲精品国产精品久久清纯直播| 欧美日韩国产首页| 亚洲女性裸体视频| 久久se精品一区精品二区| 在线播放视频一区| 亚洲人成啪啪网站| 欧美三级午夜理伦三级中视频| 亚洲一区视频在线| 欧美专区18| 日韩天堂在线视频| 亚洲伊人一本大道中文字幕| 美女网站久久| 国产精品久久激情| 在线观看日韩av先锋影音电影院| 久久久久国产精品人| 久久久久高清| 亚洲一区二区三区欧美| 欧美在线免费观看视频| 亚洲国产精品成人精品| 一区二区三区精品国产| 国产一区二区精品在线观看| 亚洲国产精品综合| 国产精品素人视频| 狼人天天伊人久久| 欧美性感一类影片在线播放| 亚洲精品久久7777| 亚洲综合国产精品| 亚洲国产精品一区在线观看不卡 | 欧美日韩视频| 欧美一区2区三区4区公司二百| 久久久久欧美| 性欧美xxxx大乳国产app| 亚洲免费观看| 欧美日韩视频第一区| 亚洲视频中文字幕| 久久久久中文| 一区二区三区.www| 国产一区二区在线观看免费播放| 亚洲大胆在线| 国产一区 二区 三区一级| 亚洲久久一区二区| 伊伊综合在线| 亚洲欧美一区二区视频| 一区二区免费在线视频| 久久av免费一区| 亚洲欧美精品伊人久久| 男女视频一区二区| 日韩亚洲一区二区| 久久不见久久见免费视频1| 亚洲看片一区| 噜噜噜躁狠狠躁狠狠精品视频 | 美国十次了思思久久精品导航| 一本到12不卡视频在线dvd| 久久九九国产精品| 午夜宅男欧美| 国产精品白丝av嫩草影院| 亚洲欧洲美洲综合色网| 亚洲人成在线观看网站高清| 欧美在线你懂的| 欧美一区久久| 久久精品亚洲乱码伦伦中文 | 亚洲国产精品t66y| 91久久精品日日躁夜夜躁欧美| 欧美成在线观看| 国产精品亚洲产品| 欧美成人按摩| 国产精品扒开腿做爽爽爽软件| 亚洲综合色噜噜狠狠| 国产精品成人免费视频 | 欧美成年网站| 在线免费观看日韩欧美| 欧美制服丝袜| 久久青青草综合| 狠狠做深爱婷婷久久综合一区| 久久九九国产精品怡红院| 久久免费偷拍视频| 亚洲电影免费观看高清完整版| 久久久视频精品| 欧美成人午夜激情在线| 亚洲欧洲一二三| 欧美精品999| 99国内精品| 欧美亚洲自偷自偷| 欧美日韩成人一区二区| 亚洲激情在线观看视频免费| 宅男精品视频|