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

天行健 君子當(dāng)自強(qiáng)而不息

游戲腳本的實(shí)現(xiàn)(1)

 

創(chuàng)建一個(gè)角色扮演游戲項(xiàng)目時(shí),會(huì)發(fā)現(xiàn)在源碼中編寫游戲相關(guān)信息十分困難(這樣做也是非常魯莽的)。最好的辦法就是使用外部數(shù)據(jù)源(類似于程序的代碼),稱之為游戲腳本(例如對(duì)話)。以這種方式,可以控制游戲的流程并節(jié)省寶貴的時(shí)間,因?yàn)椴恍枰诿看巫龀龈淖兒笾匦逻M(jìn)行編譯。
 

理解腳本

當(dāng)創(chuàng)建游戲時(shí),游戲腳本與所編寫的程序代碼非常類似,只是游戲腳本相對(duì)于游戲引擎而言是外部的。正因?yàn)樗鼈兪峭獠康模圆趴梢匝杆俚貙?duì)腳本做出更改,而不用重新編譯整個(gè)游戲引擎。否則對(duì)于一個(gè)超過100萬(wàn)行代碼的項(xiàng)目,僅僅為了改變一個(gè)對(duì)話行就要重新編譯整個(gè)項(xiàng)目。

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

相反,可以將法術(shù)以及它們對(duì)游戲中人物的影響編寫到幾個(gè)小小的腳本里。每當(dāng)戰(zhàn)斗打響時(shí),這些腳本被加載,并顯示可供選擇的法術(shù)。一旦該法術(shù)被施展,一個(gè)腳本將發(fā)揮自己的作用,從造成損傷到產(chǎn)生運(yùn)動(dòng)或法術(shù)圖形的動(dòng)畫。

有兩種類型的腳本系統(tǒng)可供使用,第一種涉及到使用某種腳本編程語(yǔ)言,在腳本文件中輸入命令,編譯該文件,并在游戲中執(zhí)行編譯好的腳本文件。第二種是第一種的簡(jiǎn)化版本,將命令輸入到一個(gè)文件中,系統(tǒng)通過從一個(gè)預(yù)先定義好的命令集里選擇命令來創(chuàng)建腳本。

為了簡(jiǎn)化問題的處理,我們使用第二種腳本系統(tǒng)來創(chuàng)建自己的腳本命令集,稱之為Mad Lib ScriptingMLS)系統(tǒng),它使用一個(gè)預(yù)先定義好的命令集合(稱為行為action),同時(shí)每個(gè)定義好的命令都與一個(gè)游戲功能相關(guān)聯(lián)。

下圖是一個(gè)腳本命令集示例:

使用這樣一個(gè)有限的行為集合,就不再需要復(fù)雜的可編譯腳本語(yǔ)言了。相反,只需要告訴腳本系統(tǒng)要使用哪些行為,以及這些行為將使用怎樣的選項(xiàng)以實(shí)現(xiàn)游戲的功能。對(duì)于這種方法,最大的好處就是不再需要為指定一個(gè)簡(jiǎn)單的行為而羅列代碼行,可以通過編號(hào)來引用行為和選項(xiàng)。

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

 

Mad Lib Scripting系統(tǒng)的設(shè)計(jì)

創(chuàng)建在游戲中想到的行為,可以通過創(chuàng)建或編輯腳本來填充那些空白點(diǎn)(稱之為條目entries)。對(duì)于每個(gè)行為,請(qǐng)明確提供一個(gè)可供空白條目填充的選項(xiàng)列表,它的類型可以從一行文本到一串?dāng)?shù)字。接著將行為和空白條目進(jìn)行編號(hào),以便腳本系統(tǒng)可以引用它們,以下是一些行為列表的范例:

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個(gè)或多個(gè)空白條目位于括號(hào)內(nèi),每個(gè)空白條目包含了一個(gè)文本字符串或者一個(gè)數(shù)字,這個(gè)行為與可能條目(以及條目的類型)的列表被稱之為行為模板(action template),如下圖所示:

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

 

MLS系統(tǒng)的編寫

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

一個(gè)行為模板需要保存行為的列表,包括文本、條目編號(hào)以及每個(gè)條目的數(shù)據(jù)。每個(gè)行為按它們?cè)诹斜碇械乃饕颠M(jìn)行編號(hào),同時(shí)每個(gè)行為中的空白條目也被加以編號(hào)。可以為每個(gè)條目指定一種類型(文本型、整數(shù)型、浮點(diǎn)型、布爾型、多重選擇型),如下所示:

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)

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

行為可以采用如下格式:

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

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

我們通過創(chuàng)建結(jié)構(gòu)體ENTRY_RULE和ACTION來處理?xiàng)l目規(guī)則與行為。

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;

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

"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) 評(píng)論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

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

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久欧美精品sm网站| 国产美女精品人人做人人爽| 亚洲欧洲三级| 欧美一区二区精品在线| 蜜臀久久99精品久久久久久9| av不卡在线观看| 久久激情网站| 亚洲欧美激情四射在线日 | 国语自产在线不卡| 99在线精品观看| 亚洲国产精品第一区二区| 亚洲欧美在线另类| 亚洲天堂av电影| 欧美一区二区在线免费观看| 亚洲午夜电影网| 欧美极品影院| 亚洲第一在线综合在线| 国产一区欧美| 亚洲欧美精品suv| 亚洲制服丝袜在线| 欧美日韩裸体免费视频| 亚洲国产99| 亚洲国产精品传媒在线观看| 亚洲视频在线观看一区| 欧美成人精品在线播放| 欧美电影打屁股sp| 一区二区视频在线观看| 亚洲欧美制服中文字幕| 亚洲欧美在线一区二区| 美腿丝袜亚洲色图| 你懂的国产精品永久在线| 国产综合久久| 久久国产精品电影| 久久精品日韩欧美| 国产午夜精品全部视频在线播放| 亚洲一区在线免费| 欧美一区二区视频97| 国产精品乱人伦一区二区| 亚洲视频第一页| 欧美亚洲一区在线| 国产婷婷97碰碰久久人人蜜臀| 亚洲专区免费| 久久精品99国产精品| 国产综合色产在线精品| 久久久午夜电影| 欧美激情a∨在线视频播放| 国产日韩亚洲欧美精品| 久久精品成人欧美大片古装| 久久综合五月天婷婷伊人| 一区二区三区自拍| 免费在线观看成人av| 亚洲人午夜精品| 亚洲免费在线播放| 欧美精品在线网站| 99在线热播精品免费| 性欧美xxxx大乳国产app| 国产亚洲人成a一在线v站 | 亚洲欧洲综合另类| 欧美日韩国产综合新一区| 中文国产成人精品久久一| 欧美一区二区视频网站| 在线播放视频一区| 欧美成人精品一区| 一区二区三区成人精品| 欧美一区日本一区韩国一区| 一区在线免费| 欧美日韩精品免费观看视一区二区 | 一区二区三区日韩精品视频| 久久激情久久| 亚洲美女在线看| 国产精品久久久久久一区二区三区| 亚洲欧美在线一区| 欧美国产在线视频| 亚洲一区中文| 亚洲承认在线| 国产精品久久久久久久久动漫| 一区二区三区久久精品| 久久亚洲高清| 亚洲欧美经典视频| 亚洲国产精品福利| 欧美性猛交xxxx乱大交退制版| 欧美亚洲综合久久| 一本色道久久综合亚洲精品婷婷| 久久久国产精品一区| 亚洲精选中文字幕| 国产原创一区二区| 欧美视频在线免费| 免费人成网站在线观看欧美高清| 亚洲国内高清视频| 久久久久网址| 亚洲香蕉伊综合在人在线视看| 欧美粗暴jizz性欧美20| 久久成人免费电影| 一区二区三区www| 男女精品网站| 久久国产精品一区二区三区四区| 亚洲久久一区| 尤物在线观看一区| 国产日韩精品久久| 免费欧美日韩| 久久精品免视看| 亚洲一区二区在线视频| 亚洲国产欧美精品| 免费一级欧美片在线播放| 羞羞视频在线观看欧美| 中文久久乱码一区二区| 亚洲激情在线观看视频免费| 国产精品九九久久久久久久| 久久国产精品99久久久久久老狼| 亚洲天堂av在线免费观看| 亚洲精品一区二区三区福利| 欧美激情第8页| 美女久久一区| 久久综合婷婷| 久久精品123| 亚洲欧美成aⅴ人在线观看| 99re66热这里只有精品4| 在线观看亚洲精品视频| 国内成人精品视频| 国产亚洲欧美一级| 国产有码在线一区二区视频| 国产日韩欧美在线播放不卡| 国产日本精品| 欧美系列精品| 国产精品电影在线观看| 欧美天堂在线观看| 欧美日韩另类丝袜其他| 欧美激情一区在线观看| 欧美精品在线免费观看| 欧美日本国产视频| 欧美日韩喷水| 米奇777在线欧美播放| 免费不卡在线观看| 久久免费视频在线观看| 久久一二三区| 欧美.www| 欧美国产日韩精品| 欧美三级在线播放| 国产精品一区在线观看你懂的| 国产日韩欧美不卡在线| 极品少妇一区二区| 亚洲国产精品久久久久秋霞影院 | 激情伊人五月天久久综合| 亚洲成色777777女色窝| 一二三区精品| 久久精品成人欧美大片古装| 欧美第一黄网免费网站| 国产精品99久久久久久久vr| 久久久九九九九| 欧美日韩一区二区免费视频| 国产专区欧美专区| 在线视频日韩| 久久尤物视频| 国产精品99久久久久久久vr| 久久免费高清视频| 国产精品视频午夜| 亚洲伦理在线| 久久三级视频| 制服丝袜亚洲播放| 免费成人网www| 国产三级欧美三级| 一区二区三区精品久久久| 久久综合综合久久综合| 宅男在线国产精品| 欧美成年人视频网站欧美| 国产日韩欧美中文| 亚洲视频在线观看一区| 免费不卡在线观看av| 亚洲视频精选在线| 亚洲视频在线视频| 欧美成人亚洲成人| 国产亚洲精品7777| 亚洲一区网站| 亚洲黄色在线看| 久久久噜噜噜| 国产一区视频在线观看免费| 亚洲欧美成人在线| 亚洲精品在线视频观看| 乱中年女人伦av一区二区| 国产一区二区毛片| 香蕉国产精品偷在线观看不卡| 亚洲精品影院| 欧美大片在线看| 1000部国产精品成人观看| 久久久精品免费视频| 亚洲影视综合| 国产精品va| 亚洲视频福利| 99精品视频免费全部在线| 欧美激情成人在线| 最新国产精品拍自在线播放| 老鸭窝亚洲一区二区三区| 性久久久久久久久久久久| 国产精品你懂的在线欣赏| 亚洲一区二区久久| 一本不卡影院| 欧美日韩精品是欧美日韩精品| 亚洲乱码国产乱码精品精可以看 | 美女国产一区| 久久久久久精|