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

天行健 君子當自強而不息

游戲腳本的實現(1)

 

創建一個角色扮演游戲項目時,會發現在源碼中編寫游戲相關信息十分困難(這樣做也是非常魯莽的)。最好的辦法就是使用外部數據源(類似于程序的代碼),稱之為游戲腳本(例如對話)。以這種方式,可以控制游戲的流程并節省寶貴的時間,因為不需要在每次做出改變后重新進行編譯。
 

理解腳本

當創建游戲時,游戲腳本與所編寫的程序代碼非常類似,只是游戲腳本相對于游戲引擎而言是外部的。正因為它們是外部的,所以才可以迅速地對腳本做出更改,而不用重新編譯整個游戲引擎。否則對于一個超過100萬行代碼的項目,僅僅為了改變一個對話行就要重新編譯整個項目。

腳本的使用并不會非常困難,而且游戲的每個方面都可以從腳本的運用中獲益,比如導航菜單、戰斗控制、處理玩家的物品清單,都可以使用腳本。舉個例子,進行游戲開發時,把自己想象成處于戰斗的用戶,他們有規律地使用一系列的法術發起攻擊。但在游戲開發過程中可能決定改變部分法術,如果法術的資料是硬編碼的話,將面臨一個非常麻煩的問題,必須更改控制法術的那些程序代碼的每個實例,更不用說去調試和檢驗那些代碼直到正確為止。為什么要花費如此多的時間去做這些改變呢?

相反,可以將法術以及它們對游戲中人物的影響編寫到幾個小小的腳本里。每當戰斗打響時,這些腳本被加載,并顯示可供選擇的法術。一旦該法術被施展,一個腳本將發揮自己的作用,從造成損傷到產生運動或法術圖形的動畫。

有兩種類型的腳本系統可供使用,第一種涉及到使用某種腳本編程語言,在腳本文件中輸入命令,編譯該文件,并在游戲中執行編譯好的腳本文件。第二種是第一種的簡化版本,將命令輸入到一個文件中,系統通過從一個預先定義好的命令集里選擇命令來創建腳本。

為了簡化問題的處理,我們使用第二種腳本系統來創建自己的腳本命令集,稱之為Mad Lib ScriptingMLS)系統,它使用一個預先定義好的命令集合(稱為行為action),同時每個定義好的命令都與一個游戲功能相關聯。

下圖是一個腳本命令集示例:

使用這樣一個有限的行為集合,就不再需要復雜的可編譯腳本語言了。相反,只需要告訴腳本系統要使用哪些行為,以及這些行為將使用怎樣的選項以實現游戲的功能。對于這種方法,最大的好處就是不再需要為指定一個簡單的行為而羅列代碼行,可以通過編號來引用行為和選項。

舉個例子,Play Sound行為的編號為4,而且該行為僅要求一個輸入,即播放聲音的編號。在腳本中只存儲兩個數值:一個對應于行為,另一個代表了聲音。使用數值表示行為(代替文本)的方法可以使這種類型腳本的處理既快速又簡單。

 

Mad Lib Scripting系統的設計

創建在游戲中想到的行為,可以通過創建或編輯腳本來填充那些空白點(稱之為條目entries)。對于每個行為,請明確提供一個可供空白條目填充的選項列表,它的類型可以從一行文本到一串數字。接著將行為和空白條目進行編號,以便腳本系統可以引用它們,以下是一些行為列表的范例:

1. Character (*NAME*) takes (*NUMBER*) damage.
2. Print (*TEXT*).
3. Play sound effect titled (*SOUND_NAME*).
4. Play music titled (*MUSIC_NAME*).
5. Create object (*OBJECT_NAME*) at coordinates (*XPOS*),(*YPOS*).
6. End script processing.

在這6種行為中,都有0個或多個空白條目位于括號內,每個空白條目包含了一個文本字符串或者一個數字,這個行為與可能條目(以及條目的類型)的列表被稱之為行為模板(action template),如下圖所示:

一旦使用了行為模板,就可以使用它們的編號而不是行為的文本進行引用(文本的存在只是為了使用戶能夠更容易理解每個行為所實現的功能)。

 

MLS系統的編寫

為了使MLS系統功能盡可能強大,需要設計它以便可以支持多重行為的模板,而且每個行為模板都包含不受數量限制的行為。以這種方式,就可以將系統復用到任何想要的項目中。當一個腳本完成時,將腳本讀入到引擎中,并處理各自的行為,為每個由腳本編輯器所輸入的行為使用指定的條目。

一個行為模板需要保存行為的列表,包括文本、條目編號以及每個條目的數據。每個行為按它們在列表中的索引值進行編號,同時每個行為中的空白條目也被加以編號。可以為每個條目指定一種類型(文本型、整數型、浮點型、布爾型、多重選擇型),如下所示:

0. No entry type
1. Text entry
2. Boolean value
3. Integer number
4. Float number
5. Multiple choice (a choice from a list of text selections)

每個條目類型都有一個獨特的特征,字符串類型的長度是可以變化的,數字型可以是兩個數字范圍之間的任何數值,而布爾值可以是TRUE或者FALSE。至于多重選項型,每個選項都有它自己的文本字符串(腳本從一個列表中獲取選項,而且所選選項的索引編號比它的文本更適用)。

行為可以采用如下格式:

Action #1: Spell targets (*MULTIPLE_CHOICE*).

Possible choices for blank entry #1:
1. Player character
2. Spell caster
3. Spell target
4. Nobody

我們通過創建結構體ENTRY_RULE和ACTION來處理條目規則與行為。

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

typedef 
char* char_ptr;
typedef 
int   BOOL;

//============================================================================
// Structures to store information about a single blank entry.
//============================================================================
typedef struct ENTRY_RULE
{
    
long    type;     // type of blank entry (ENTRY_TEXT, ENTRY_BOOL, )

    // The following two unions contain the various information about a single blank entry, 
    // from the min/max values (for int and float types), as well as the number of choices 
    // in a multiple choice entry.
    union
    {
        
long        long_min;       // min value of long type
        float       float_min;      // min value of float type
        long        num_choices;    // number of choices in list
    };

    union
    {
        
long        long_max;       // max value of long type
        float       float_max;      // max value of float type
        char_ptr*   choices;        // choice text array    
    };

    
// structure constructor to clear to default values
    ENTRY_RULE()
    {
        memset(
this, 0, sizeof(*this));
    }

    
// structure destructor to clean up used resources
    ~ENTRY_RULE()
    {
        
// special case for choice type
        if(type == ENTRY_CHOICE && choices != NULL)
        {
            
for(long i = 0; i < num_choices; i++)            
                delete[] choices[i];
                
            delete[] choices;            
        }
    }
} *ENTRY_RULE_PTR;

//============================================================================
// Structure that store a single action.
//============================================================================
typedef struct ACTION
{
    
long            index;              // action index [0, number of action - 1]
    char            text[256];          // action text

    
short           num_entries_rule;   // number of entries in action
    ENTRY_RULE_PTR  entries_rule;       // array of entry structures

    ACTION*         next;               
// next action in linked list

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

    ~ACTION()
    {
        delete[] entries_rule;
        delete next;
    }
} *ACTION_PTR;

行為模板被存儲為文本文件,同時每個行為的文本被包括在括號中。每個包含條目的行為(標記為文本中的波浪字符)緊跟著是條目數據的列表。每個條目由一個描述條目類型(文本型、布爾型、整型、浮點型或選項型)的單詞開始。對于文本類型而言并沒有更多的需要信息,對于布爾類型來說也是如此。而作為整數和浮點型,則要求一個最小值和最大值。最后,選項類型條目后跟著的是可供選擇的編號以及每個選項的文本(包括在引號里)。如下所示:

"If flag #~ is ~ then"
INT 0 255
BOOL

"Else"

"Endif"

"Set flag #~ to ~"
INT 0 255
BOOL

"Print ~"
TEXT

"Move character to ~, ~, ~"
FLOAT 0.0 2048.0
FLOAT 0.0 2048.0
FLOAT 0.0 2048.0

"Character ~ ~ ~ ~ points"
CHOICE 3
"Main Character"
"Caster"
"Target"
CHOICE 2
"Gains"
"Looses"
INT 0 128
CHOICE 2
"Hit"
"Magic"

"Engage in battle sequence #~"
INT 0 65535

"End Script"

posted on 2007-11-03 01:44 lovedday 閱讀(1137) 評論(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>
            国产亚洲永久域名| 亚洲综合第一| 亚洲伊人伊色伊影伊综合网| 欧美视频不卡| 午夜亚洲影视| 免播放器亚洲一区| 亚洲精品在线观| 欧美午夜大胆人体| 午夜精品久久久久久99热| 狂野欧美激情性xxxx| 亚洲第一中文字幕| 欧美日韩亚洲一区二| 亚洲在线视频一区| 欧美成人精品h版在线观看| 亚洲欧洲在线播放| 国产精品日韩精品| 久久综合给合久久狠狠色 | 亚洲二区视频| 亚洲午夜电影在线观看| 国产一区二区三区四区hd| 欧美11—12娇小xxxx| 一道本一区二区| 久热精品视频在线观看一区| aa成人免费视频| 国产一区二区三区免费观看| 欧美激情第9页| 欧美一区国产在线| 91久久久亚洲精品| 久久精品国产999大香线蕉| 亚洲人成在线观看网站高清| 国产精品久久久久久久久久三级 | 久久亚洲春色中文字幕| 99国产精品| 麻豆免费精品视频| 亚洲欧美美女| 亚洲美女在线国产| 一色屋精品视频免费看| 欧美视频免费在线| 老司机精品视频一区二区三区| 一区二区三区欧美成人| 欧美国产亚洲精品久久久8v| 午夜欧美电影在线观看| 亚洲精选中文字幕| 在线观看日韩一区| 国产欧美一区二区精品忘忧草| 欧美精品激情blacked18| 久久精品在线免费观看| 亚洲免费视频网站| 一本色道久久综合亚洲精品婷婷| 欧美激情亚洲激情| 美女精品国产| 久久精品一区蜜桃臀影院| 亚洲尤物精选| 一区二区不卡在线视频 午夜欧美不卡在| 激情欧美日韩| 国产在线播放一区二区三区| 国产精品久久影院| 欧美视频日韩| 欧美日韩一本到| 欧美电影在线播放| 免费看av成人| 欧美不卡在线| 欧美成人xxx| 欧美大片91| 欧美成人综合网站| 欧美高清在线播放| 欧美精品123区| 欧美喷水视频| 欧美午夜激情小视频| 欧美三区视频| 国产精品色在线| 国产精品久久久久久久久久妞妞 | 国产精品一区在线观看你懂的| 欧美日韩在线视频一区二区| 欧美日韩黄视频| 欧美日韩精品伦理作品在线免费观看| 欧美国产精品一区| 欧美日韩国产一区二区三区| 欧美日韩理论| 国产精品久久久久久久第一福利| 欧美视频一区在线观看| 欧美午夜一区二区福利视频| 国产精品嫩草久久久久| 国产乱码精品一区二区三| 国产精品日韩久久久久| 国产亚洲欧洲一区高清在线观看| 国产一区二区视频在线观看| 在线观看三级视频欧美| 91久久国产自产拍夜夜嗨| 日韩午夜在线电影| 中国成人黄色视屏| 欧美一区二区观看视频| 久久精品亚洲精品| 欧美风情在线观看| 日韩亚洲欧美在线观看| 亚洲在线观看视频| 久久久噜噜噜久久中文字免| 欧美成人免费全部观看天天性色| 欧美色大人视频| 国产亚洲毛片在线| 亚洲区中文字幕| 亚洲欧美中日韩| 可以看av的网站久久看| 亚洲精品自在在线观看| 亚洲一区在线视频| 久久综合一区二区三区| 欧美日韩一区二区三区视频| 国产日韩欧美不卡在线| 91久久精品网| 亚洲欧洲av一区二区| 免费观看在线综合| 99综合在线| 久久久国产精品一区| 欧美日韩亚洲一区在线观看| 狠狠干成人综合网| 中文亚洲字幕| 欧美成ee人免费视频| 亚洲深夜影院| 免费成人av资源网| 国产视频不卡| 99国产精品久久| 久久中文字幕一区| 在线午夜精品自拍| 欧美大尺度在线观看| 国产一区二区成人久久免费影院| 99v久久综合狠狠综合久久| 久久精品国产精品亚洲精品| 日韩一二三区视频| 久久亚洲综合网| 国产精品美女一区二区| 亚洲精品一级| 米奇777超碰欧美日韩亚洲| 亚洲午夜精品一区二区| 嫩模写真一区二区三区三州| 国产亚洲一区二区在线观看| 亚洲午夜一二三区视频| 亚洲春色另类小说| 久久久久国产精品一区二区| 国产精品久久夜| 夜夜嗨av一区二区三区四区| 欧美成人免费播放| 欧美中文字幕在线播放| 国产精品高潮视频| 亚洲手机视频| 日韩午夜一区| 欧美精品九九99久久| 亚洲国产精品一区制服丝袜| 久久嫩草精品久久久精品一| 亚洲一区二区成人| 欧美性大战久久久久| 日韩一级黄色片| 亚洲人成7777| 欧美激情一区二区三区高清视频| 亚洲大胆av| 欧美jizz19性欧美| 久久精品亚洲一区二区| 国产偷久久久精品专区| 欧美一级视频免费在线观看| 在线视频免费在线观看一区二区| 欧美日韩1区2区| 中国成人亚色综合网站| 99re6热在线精品视频播放速度| 欧美国产日产韩国视频| 亚洲美女av在线播放| 亚洲欧洲一区二区天堂久久 | 欧美激情综合色| 亚洲精品久久| 亚洲精品美女91| 欧美日韩成人| 亚洲综合成人婷婷小说| 在线视频一区观看| 国产乱人伦精品一区二区| 欧美一区二区三区免费观看视频 | 久久精品最新地址| 亚洲第一综合天堂另类专| 亚洲第一免费播放区| 欧美成人精品一区二区| 宅男噜噜噜66一区二区| 亚洲一二三区视频在线观看| 国产区欧美区日韩区| 久久午夜国产精品| 欧美成人免费大片| 亚洲一区免费视频| 欧美一级大片在线观看| 激情伊人五月天久久综合| 亚洲福利av| 欧美视频国产精品| 久久精品国产精品亚洲| 毛片一区二区三区| 一本色道88久久加勒比精品 | 久久精品免费看| 亚洲黄色免费| 国产精品99久久99久久久二8| 国产欧美一区二区精品婷婷 | 欧美视频日韩视频| 久久婷婷亚洲| 欧美日韩你懂的| 久久精品视频免费| 欧美国产视频在线观看| 午夜精品久久久久久久蜜桃app|