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

天行健 君子當自強而不息

Controlling Players and Characters(15)

 

To see more details about game script,see 游戲腳本的實現(xiàn)

 

Scripting and Characters


Scripting keeps popping its head up throughout these last few chapters, and true
to form, scripting plays a major role when dealing with characters. Scripts work
with conversations, spells, character movement, and much more.


What you need at this point is a clean-cut method of processing the game scripts.
The best way to do this is to create a class to entwine into your character and other
application processing.

 

The Script Class

it becomes even easier to execute scripts when you put the whole script processing in a class.

enum ENTRY_TYPE { ENTRY_NONE = 0, ENTRY_TEXT, ENTRY_BOOL, ENTRY_INT, ENTRY_FLOAT, ENTRY_CHOICE };

typedef 
struct sEntry
{
    
long    type;               // type of blank entry (ENTRY_TEXT, ENTRY_BOOL, )

    union
    {
        
long    io_value;       // used for saving/loading
        long    length;         // length of text (0 terminator)
        long    selection;      // selection in choice
        BOOL    bool_value;     
        
long    long_value;     
        
float   float_value;    
    };

    
char*   text;               // entry text buffer

    sEntry()
    {
        memset(
this, 0, sizeof(*this));
    }

    ~sEntry()
    {
        delete[] text;
    }
} *sEntryPtr;

////////////////////////////////////////////////////////////////////////////////////

typedef 
struct sScriptInfo
{
    
long        action_index;   // [0, number of actions - 1]

    
long        num_entries;    // number of entries in this action
    sEntry*     entries;        // array of entries

    sScriptInfo*     prev;      
// previous in linked list
    sScriptInfo*     next;      // next in linked list

    sScriptInfo()
    {
        memset(
this, 0, sizeof(*this));
    }

    ~sScriptInfo()
    {
        delete[] entries;
        delete next;
    }
} *sScriptInfoPtr;

////////////////////////////////////////////////////////////////////////////////////

typedef 
class cScript
{
private:
    
long            m_num_actions;
    sScriptInfo*    m_root_script_info;

private:
    
virtual bool prepare() { return true; }
    
virtual bool release() { return true; }

    
virtual sScriptInfo* process(sScriptInfo* script_info)
    {
        
return script_info->next;
    }

public:
    cScript()
    {
        m_num_actions = 0;
        m_root_script_info = NULL;
    }

    ~cScript()
    {
        free();
    }

    
void free()
    {
        delete m_root_script_info;
        m_root_script_info = NULL;

        m_num_actions = 0;
    }

    sScriptInfo* get_root_script_info()
    {
        
return m_root_script_info;
    }
    
    
bool load(const char* filename);
    
void execute(const char* filename);    
} *cScriptPtr;

Although deceptively small, the cScript class packs a punch. Loading a script is
accomplished via the Load function. Once it’s loaded, you can process the script
with a call to Execute. If you don’t want to hassle with loading a script
before processing, a call to the Execute function takes a script file
to load and execute in the same function call (plus it frees the script when execution is complete).


bool cScript::load(const char* filename)
{
    free();

    FILE* fp;

    
if((fp = fopen(filename, "rb")) == NULL)
        
return false;

    fread(&m_num_actions, 1, 
sizeof(m_num_actions), fp);

    sScriptInfo* head = NULL;
    sScriptInfo* ptr = NULL;

    
// loop through each script action
    for(long i = 0; i < m_num_actions; i++)
    {
        
// allocate a script structure and link in

        sScriptInfo* info = 
new sScriptInfo;
        info->next = NULL;

        
if(ptr == NULL)
            head = info;
        
else
            ptr->next = info;

        ptr = info;

        fread(&info->action_index, 1, 
sizeof(info->action_index), fp);
        fread(&info->num_entries, 1, 
sizeof(info->num_entries), fp);

        
// get entry data (if any)
        if(info->num_entries)
        {
            info->entries = 
new sEntry[info->num_entries];

            
// load in each entry
            for(long j = 0; j < info->num_entries; j++)
            {
                fread(&info->entries[j].type, 1, 
sizeof(info->entries[j].type), fp);
                fread(&info->entries[j].io_value, 1, 
sizeof(info->entries[j].io_value), fp);

                
// get text (if any)
                if(info->entries[j].type == ENTRY_TEXT && info->entries[j].length)
                {
                    info->entries[j].text = 
new char[info->entries[j].length];
                    fread(info->entries[j].text, 1, info->entries[j].length, fp);
                }
            }
        }
    }

    fclose(fp);

    m_root_script_info = head;

    
return true;
}

void cScript::execute(const char* filename)
{
    
// load script if none already
    if(filename)
        load(filename);

    
// prepare script data for execution
    if(! prepare())
        
return;

    
// start at beginning of script
    sScriptInfo* ptr = m_root_script_info;
    
if(ptr == NULL)
        
return;
    
    
// loop until no more script actions
    while(ptr)
    {
        
// Call script function and break on NULL return value.
        // Any other return type is the pointer to the next function, which is typically ptr->next.
        ptr = process(ptr);
    }

    release();

    
// release script if execute loaded it
    if(filename)
        free();
}

TIP
Using the Load function to load a script is useful if the script is processed many times
because you don’t have to free it between uses. Loading a script within the Execute
function forces the script to be loaded and freed every time, wasting precious time.

The way the cScript class processes scripts is ingenious. You actually have to derive the cScript class to
parse each script action as it is processed. That’s the purpose of the Process function.
Once a script is loaded, the Process function is called for every script action to process.

Each script pointer is queried for the script action number, and you must decide
what to do with the action. Then you need to update the script pointers by returning
the pointer to the next script action in the linked list.


posted on 2007-11-14 19:45 lovedday 閱讀(146) 評論(0)  編輯 收藏 引用


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人高清视频| 久久精品视频在线观看| 亚洲欧美成人一区二区在线电影| 久久影视精品| 久久国产精品99久久久久久老狼| 国产视频在线观看一区二区三区| 一区二区三区日韩| 在线观看视频欧美| 久久国产免费| 久久综合电影| 一区二区三区毛片| 亚洲午夜免费视频| 欧美涩涩网站| 久久久国产精品一区| 久久嫩草精品久久久精品| 日韩视频不卡| 亚洲欧美国产日韩天堂区| 黄色免费成人| 亚洲精品视频一区| 欧美三级欧美一级| 久久国产欧美| 欧美精品一区二区三区在线播放| 亚洲宅男天堂在线观看无病毒| 欧美一区二区三区在线看 | 欧美大片专区| 亚洲欧美一级二级三级| 久久久久久夜| 亚洲欧美国产毛片在线| 久久久噜噜噜| 欧美在线观看一区二区三区| 久久嫩草精品久久久精品| 亚洲欧美日韩国产另类专区| 狂野欧美激情性xxxx欧美| 午夜日韩视频| 欧美人与禽猛交乱配| 久久久精品五月天| 欧美亚洲不卡| 亚洲激情视频网站| 国产私拍一区| 一本一道久久综合狠狠老精东影业| 国产自产在线视频一区| 亚洲视频 欧洲视频| 91久久久亚洲精品| 久久久精品国产一区二区三区| 亚洲欧美日韩人成在线播放| 欧美成人精品在线| 久久综合久久综合九色| 国产日韩高清一区二区三区在线| 亚洲午夜视频在线观看| 午夜影院日韩| 国产欧美在线观看一区| 久久久精品欧美丰满| 欧美国产欧美综合 | 亚洲一区二区三区四区中文| 中文精品视频| 国产精品久久久久久久久久三级| 亚洲免费高清视频| 亚洲欧美日韩国产一区| 国产欧美1区2区3区| 欧美影院在线播放| 麻豆av一区二区三区久久| 亚洲第一在线| 欧美精品在线视频观看| 夜夜嗨av一区二区三区中文字幕| 亚洲视频一二| 国产乱人伦精品一区二区| 亚洲一区二区三区视频播放| 欧美在线视频日韩| 亚洲欧美中文日韩在线| 国产亚洲永久域名| 久久精品成人欧美大片古装| 女人香蕉久久**毛片精品| 日韩视频在线免费| 欧美调教视频| 先锋影音久久久| 美女久久一区| av成人免费在线| 国产精品区一区二区三区| 欧美主播一区二区三区美女 久久精品人 | 老鸭窝毛片一区二区三区| 在线观看欧美视频| 欧美了一区在线观看| 亚洲一区二区三区免费观看| 久久久久国产一区二区三区| 91久久精品www人人做人人爽| 欧美精品久久久久久| 亚洲——在线| 欧美成人dvd在线视频| 亚洲视频每日更新| 亚洲电影观看| 国产精品狠色婷| 免费人成网站在线观看欧美高清| 亚洲视频中文| 欧美激情影音先锋| 久久国产视频网站| 一区二区三区 在线观看视频| 国产永久精品大片wwwapp| 欧美吻胸吃奶大尺度电影| 久久一本综合频道| 亚洲专区在线| 亚洲精品一区二区三区四区高清 | 国产精品日韩欧美一区| 麻豆91精品| 欧美一区免费视频| 99精品黄色片免费大全| 欧美成人精品激情在线观看| 亚洲免费在线视频| 亚洲精品一二三区| 激情综合自拍| 国产欧美一区二区精品婷婷| 欧美日韩免费一区二区三区视频 | 老司机精品视频网站| 亚洲欧美一区二区原创| 亚洲狼人精品一区二区三区| 国产亚洲综合在线| 国产精品国产三级国产专区53 | 欧美激情日韩| 久久蜜桃香蕉精品一区二区三区| 亚洲一区二区在线播放| 一区二区91| 日韩亚洲欧美成人| 亚洲国产精品专区久久| 黄色国产精品一区二区三区| 国产精品一二三四| 国产精品久久久久久久久久三级 | 久久免费精品视频| 免费成人黄色片| 久久精品国产v日韩v亚洲| 亚洲一区999| 亚洲精品一区二区三区99| 欧美mv日韩mv亚洲| 欧美在线视频一区二区| 亚洲一区二区日本| 中日韩美女免费视频网址在线观看| 激情一区二区| 国产在线播精品第三| 国产一区二区三区黄视频| 国产精品亚洲视频| 欧美三区美女| 欧美区视频在线观看| 欧美高清不卡| 欧美精品www在线观看| 欧美成人精品在线| 欧美激情国产日韩精品一区18| 蜜桃av噜噜一区| 久久人人爽爽爽人久久久| 久久久精品国产免大香伊| 久久久久久尹人网香蕉| 久久精品国产精品亚洲| 欧美在线综合视频| 久久看片网站| 鲁鲁狠狠狠7777一区二区| 久久五月婷婷丁香社区| 欧美成人精品在线观看| 女人色偷偷aa久久天堂| 欧美激情影音先锋| 欧美日韩另类国产亚洲欧美一级| 麻豆av一区二区三区久久| 久久久久网站| 欧美高清视频| 欧美午夜精品久久久久久人妖| 国产精品国产三级欧美二区| 国产午夜精品一区理论片飘花| 国内成人自拍视频| 亚洲精品字幕| 午夜欧美精品| 久久久欧美精品| 亚洲国产视频直播| 99精品欧美| 午夜一区二区三区在线观看| 久久综合影视| 欧美日韩免费在线观看| 欧美不卡高清| 久久亚洲一区二区三区四区| 欧美精品久久久久久久| 欧美色精品天天在线观看视频| 欧美午夜www高清视频| 国内外成人免费激情在线视频网站 | 国产婷婷精品| 亚洲精品一区在线观看| 亚洲视频一起| 久久精品视频va| 亚洲国产成人91精品| 一二三区精品福利视频| 亚洲影院免费| 美女国产一区| 国产精品老女人精品视频| 在线播放日韩欧美| 中国成人亚色综合网站| 老鸭窝毛片一区二区三区| 亚洲美女啪啪| 巨胸喷奶水www久久久免费动漫| 欧美精品一区二区三区一线天视频| 国产精品你懂得| 亚洲国产欧美日韩精品| 国产精品美女久久久| 国产午夜精品全部视频播放| 亚洲精品免费电影| 久久婷婷国产综合国色天香| 亚洲精品免费看|