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

天行健 君子當(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萬行代碼的項(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)可供使用,第一種涉及到使用某種腳本編程語言,在腳本文件中輸入命令,編譯該文件,并在游戲中執(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ù)雜的可編譯腳本語言了。相反,只需要告訴腳本系統(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>
            国产综合色一区二区三区| 久久久久久久久一区二区| 一本久久综合亚洲鲁鲁| 黄色日韩网站| 黄色成人免费网站| 韩国av一区二区三区在线观看| 国产精品久久久久久久久久免费看| 女生裸体视频一区二区三区| 在线播放视频一区| 伊人色综合久久天天| 国外成人性视频| 亚洲电影免费观看高清| 亚洲精品小视频| 亚洲色图综合久久| 亚洲视频免费在线| 香蕉久久一区二区不卡无毒影院| 亚洲午夜一二三区视频| 亚洲一区二区在线观看视频| 亚洲一区在线直播| 久久久久国产成人精品亚洲午夜| 久久综合给合久久狠狠色| 欧美成人国产va精品日本一级| 欧美日韩一级黄| 国产亚洲一二三区| 亚洲美女色禁图| 午夜视频久久久久久| 欧美不卡三区| 亚洲视频导航| 久久综合九色| 国产精品高潮呻吟久久av无限| 国产一区二区高清不卡| 最新中文字幕亚洲| 欧美永久精品| 亚洲成人在线视频播放 | 久久久精品动漫| 欧美精品一区三区| 极品少妇一区二区| 亚洲在线观看免费视频| 亚洲欧美日韩在线高清直播| 禁久久精品乱码| 亚洲视频一二三| 欧美国产成人精品| 欧美亚洲一级| 国产精品日韩欧美大师| 99精品99久久久久久宅男| 久久久噜噜噜久噜久久| 一二三区精品福利视频| 欧美成人一区二免费视频软件| 国产日韩精品久久| 亚洲一区二区伦理| 欧美国产综合视频| 欧美在线观看视频在线| 国产精品日韩二区| 日韩一区二区精品在线观看| 美女主播精品视频一二三四| 午夜在线成人av| 国产精品专区h在线观看| 99re视频这里只有精品| 亚洲高清激情| 久久精品免视看| 欧美午夜精品理论片a级按摩| 久久夜色精品亚洲噜噜国产mv| 欧美日韩p片| 国产精品久久午夜夜伦鲁鲁| 国产精品99久久久久久宅男| 亚洲国产精品久久久久婷婷884 | 欧美三级电影一区| 欧美va天堂在线| 国产精品日日摸夜夜添夜夜av| 一区二区三区鲁丝不卡| 性做久久久久久| 亚洲欧美日韩区| 欧美不卡三区| 亚洲天堂免费在线观看视频| 欧美一区=区| 久久久久亚洲综合| 欧美视频一区二区三区| 性久久久久久| 欧美一区二区啪啪| 午夜精品视频在线观看一区二区| 国产亚洲欧美日韩日本| 一区二区电影免费观看| 国产精品99久久久久久有的能看 | 欧美日韩在线观看一区二区| 国产精品国产福利国产秒拍| 欧美一区二区三区四区夜夜大片 | 久久久久国产精品午夜一区| 亚洲精品中文字幕在线| 久久精品成人欧美大片古装| 欧美一区二视频在线免费观看| 一区二区三区国产在线观看| 欧美日韩免费在线| 亚洲亚洲精品在线观看| 亚洲欧美福利一区二区| 亚洲香蕉网站| 在线观看av不卡| 亚洲少妇在线| 久久久亚洲国产天美传媒修理工| 欧美成人一区在线| 欧美一区二区三区在线观看 | 亚洲一区二区三区四区中文| 嫩草成人www欧美| 欧美伊人久久大香线蕉综合69| 最新国产の精品合集bt伙计| 国产欧美日韩专区发布| 国产精品自拍视频| 亚洲欧洲综合另类在线| 亚洲一区二区三区色| 亚洲国产成人在线播放| 亚洲综合日韩在线| 国产欧美在线| 日韩一区二区电影网| 欧美三级日本三级少妇99| 欧美www视频在线观看| 久久久国产精品一区二区中文 | 美女脱光内衣内裤视频久久影院| 一本色道**综合亚洲精品蜜桃冫 | 久久精品中文字幕一区二区三区| 欧美大秀在线观看| 亚洲美女淫视频| 久久综合中文| 日韩午夜在线观看视频| 久久女同互慰一区二区三区| 一区久久精品| 久久国产主播精品| 欧美图区在线视频| 亚洲精品国产视频| 亚洲激情av| 亚洲欧美偷拍卡通变态| 亚洲在线视频观看| 亚洲欧美变态国产另类| 亚洲一区二区三区中文字幕| 亚洲欧美日韩直播| 亚洲欧美日韩精品综合在线观看| 亚洲成人在线视频播放| 午夜精品在线| 亚洲欧美日产图| 久久综合中文色婷婷| 免费观看在线综合色| 欧美精品一区二区三区高清aⅴ| 免费91麻豆精品国产自产在线观看| 免费观看成人www动漫视频| 久久精品首页| 免费一级欧美片在线播放| 久久综合久久综合久久综合| 欧美一级久久久| 久久精品国产99国产精品| 久久久久综合网| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩视频在线观看国产| 欧美一区二视频| 欧美超级免费视 在线| 欧美日韩视频免费播放| 美日韩精品免费| 欧美视频在线观看免费网址| 亚洲国产三级在线| 尤物yw午夜国产精品视频| 久久亚洲国产精品日日av夜夜| 亚洲一区中文| 国产欧美日韩综合一区在线观看 | 免费观看在线综合色| 在线播放豆国产99亚洲| 女人香蕉久久**毛片精品| 久久久蜜桃一区二区人| 亚洲国产精品一区二区久| 午夜精品久久久久久99热软件| 久久综合久久综合这里只有精品| 欧美精品1区2区| 亚洲欧美日韩国产综合| 99国产精品99久久久久久粉嫩| 欧美在线视频免费播放| 亚洲婷婷在线| 欧美日本国产一区| 欧美激情第六页| 亚洲黄一区二区三区| 久久久久久午夜| 久久亚洲春色中文字幕| 国产精品久久一卡二卡| 久久久久国产一区二区三区| 亚洲成色999久久网站| 久久精品视频免费播放| 亚洲精品孕妇| 欧美精品v国产精品v日韩精品 | 亚洲综合社区| 亚洲国产高清自拍| 一区二区不卡在线视频 午夜欧美不卡' | 一级日韩一区在线观看| 国产日产欧美精品| 亚洲欧美激情视频在线观看一区二区三区| 久热国产精品视频| 久久久久久久久久久久久9999| 一区二区日韩伦理片| 噜噜噜在线观看免费视频日韩| 一区二区视频免费完整版观看| 欧美日韩综合在线| 亚洲网站在线播放| 亚洲美女视频在线免费观看| 老司机免费视频久久| 尤物精品国产第一福利三区 | 免费在线欧美黄色|