`
micheal19840929
  • 浏览: 166364 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

游戏脚本的实现

阅读更多

创建一个角色扮演游戏项目时,会发现在源码中编写游戏相关信息十分困难(这样做也是非常鲁莽的)。最好的办法就是使用外部数据源(类似于程序的代码),称之为游戏脚本(例如对话)。以这种方式,可以控制游戏的流程并节省宝贵的时间,因为不需要在每次做出改变后重新进行编译。
 

理解脚本

    当创建游戏时,游戏脚本与所编写的程序代码非常类似,只是游戏脚本相对于游戏引擎而言是外部的。正因为它们是外部的,所以才可以迅速地对脚本做出更改,而不用重新编译整个游戏引擎。否则对于一个超过100万行代码的项目,仅仅为了改变一个对话行就要重新编译整个项目。

    脚本的使用并不会非常困难,而且游戏的每个方面都可以从脚本的运用中获益,比如导航菜单、战斗控制、处理玩家的物品清单,都可以使用脚本。举个例子,进行游戏开发时,把自己想象成处于战斗的用户,他们有规律地使用一系列的法术发起攻击。但在游戏开发过程中可能决定改变部分法术,如果法术的资料是硬编码的话,将面临一个非常麻烦的问题,必须更改控制法术的那些程序代码的每个实例,更不用说去调试和检验那些代码直到正确为止。为什么要花费如此多的时间去做这些改变呢?

    相反,可以将法术以及它们对游戏中人物的影响编写到几个小小的脚本里。每当战斗打响时,这些脚本被加载,并显示可供选择的法术。一旦该法术被施展,一个脚本将发挥自己的作用,从造成损伤到产生运动或法术图形的动画。

    有两种类型的脚本系统可供使用,第一种涉及到使用某种脚本编程语言,在脚本文件中输入命令,编译该文件,并在游戏中执行编译好的脚本文件。第二种是第一种的简化版本,将命令输入到一个文件中,系统通过从一个预先定义好的命令集里选择命令来创建脚本。

    为了简化问题的处理,我们使用第二种脚本系统来创建自己的脚本命令集,称之为Mad Lib Scripting(MLS)系统,它使用一个预先定义好的命令集合(称为行为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"

 

分享到:
评论

相关推荐

    一个用lua写的游戏脚本实例

    "游戏脚本设计与实现" ...从提供的游戏脚本实例中,我们可以了解到游戏脚本设计的基本结构、游戏任务的设计、游戏机制的实现、游戏逻辑的编写、lua语言在游戏脚本中的应用、游戏脚本的优化和游戏脚本的测试等知识点。

    C#实现的脚本引擎

    本人用C#实现的脚本引擎 支持基本的条件分支 跳转 循环和数学运算,可以扩展自己的控制函数。 主要用作于游戏脚本。 不了解其中的原理和作用的可以参见本人的本站上的技术博文:开发Window Phone 7下的Galgame(一...

    实现一个脚本引擎,实现一个脚本引擎

    实现一个脚本引擎是一项复杂而有趣的任务,它涉及到编译器设计、...尽管存在性能和学习曲线的挑战,但实现一个脚本引擎对于游戏开发和其他领域都有很大的价值。通过逐步的学习和实践,你可以创建出一个强大的脚本系统。

    各类游戏脚本制作教程,简化你的操作

    这段脚本实现的功能如下: - 首先检查玩家金币是否超过10000,等级是否达到30级。 - 如果满足条件,则扣除10000金币并将玩家传送到地图“717”。 - 如果不满足条件,则显示一条提示信息并退出交互。 #### 高级脚本...

    适合网游玩家的一款脚本大师

    【标题】:“适合网游玩家的一款脚本大师”指的是ScriptExpert,这是一款专为网络游戏爱好者设计的脚本制作工具。它允许用户自定义游戏中的各种操作,实现自动化,从而减轻手动操作的压力,提高游戏效率。 【描述】...

    游戏脚本高级编程附带资料.7z

    通过脚本可以实现基本的AI,如有限状态机(FSM)和行为树,让游戏角色表现出智能行为。 7. **网络编程**:对于多人在线游戏,网络编程是关键,涉及同步、延迟补偿和数据包序列化。例如,使用UDP协议实现低延迟通信...

    游戏脚本-其他脚本.zip

    "其他脚本.zip"这个压缩包可能包含了各种非主流或特定用途的游戏脚本,这些脚本可以帮助开发者实现游戏内的特定功能,增强游戏体验,或者优化游戏性能。让我们深入探讨一下游戏脚本及其相关知识点。 1. **游戏引擎...

    Ruby自动化脚本实现网络拓扑映射

    标题、描述及标签均指向了“Ruby自动化脚本实现网络拓扑映射”这一主题,然而,实际的部分内容却似乎与自动化脚本或网络拓扑映射没有直接关联,而更像是一个自动化操作的脚本示例,可能用于模拟鼠标移动和键盘输入,...

    网游脚本C++源码

    网游脚本是游戏开发中的一个重要组成部分,主要用于控制游戏内的逻辑、交互和自动化任务。C++是一种强大且广泛应用的编程语言,常被用于构建高性能的游戏引擎和复杂系统。在这个"网游脚本C++源码"中,我们可以深入...

    基于QT的脚本功能实现

    - 游戏逻辑:在游戏开发中,通过脚本控制角色行为、游戏规则等,提高灵活性。 - 自动化测试:编写JavaScript脚本来自动化测试QT应用程序的功能。 了解并掌握这些知识点,开发者可以充分利用QT的脚本功能,提升应用...

    游戏引擎实现c++调用c#脚本功能mono.rar

    Unity游戏引擎是其中的佼佼者,它支持多种编程语言,包括C#,而C#脚本的运行正是通过Mono框架实现的。这个“游戏引擎实现c++调用c#脚本功能mono.rar”压缩包包含的文件正是与这个过程相关的Mono库。 Mono是一个开源...

    公告板(billboard)脚本2

    论 Unity 中的公告板(Billboard)脚本实现 公告板(Billboard)脚本是 Unity 中一种常用的技术,用于实现物体面朝向摄像机的效果。下面我们将对公告板脚本的实现进行详细的分析和解释。 一、公告板脚本的基本概念...

    Parker—游戏脚本制作教程

    在游戏开发领域,脚本制作是一项至关重要的技术,它能够帮助开发者实现游戏的逻辑控制、交互功能以及自动化过程。"Parker—游戏脚本制作教程"聚焦于这一核心技能,旨在教你如何创建高效且自动化的游戏脚本。下面将...

    Python-基于pywin32的游戏脚本

    【Python-基于pywin32的游戏脚本】 Python是一种强大的编程语言,被广泛应用于各种领域,包括游戏自动化。在本项目中,我们关注的是如何利用Python的pywin32库来实现对Windows操作系统中的游戏窗口进行操作。pywin...

    游戏脚本高级编程光盘文件3

    游戏脚本高级编程是开发游戏过程中至关重要的一环,它涉及到游戏逻辑、交互、动画、AI(人工智能)等多个方面的实现。这个“游戏脚本高级编程光盘文件3”可能包含了一系列用于学习和实践游戏脚本编程的资源,如教程...

    快手小游戏模拟器中控引流脚本

    总的来说,快手小游戏模拟器中控引流脚本是结合了自动化、个性化和营销策略的工具,旨在帮助用户在快手小游戏平台上实现更高效、更安全的互动和流量增长。然而,使用此类脚本时,用户仍需注意遵守快手平台的使用规则...

    游戏脚本高级编程光盘文件1

    3. **游戏逻辑控制**:编写游戏脚本需要掌握流程控制结构,如条件语句(if-else)、循环(for、while)和函数调用,用于实现游戏规则和玩家交互。 4. **游戏对象生命周期管理**:了解如何创建、销毁和管理游戏对象...

    Python游戏脚本语言(精讲)

    1. 游戏逻辑实现:Python 可以用于实现游戏逻辑,如游戏规则、游戏 AI 等。 2. 游戏内容生成:Python 可以用于生成游戏内容,如游戏关卡、游戏 NPC 等。 3. 游戏自动化测试:Python 可以用于自动化游戏测试,如自动...

    TC游戏脚本实例

    7. **脚本整合**:“QQ仙镜”可能包含多个脚本文件,它们之间需要有良好的模块化设计和协同工作,以实现复杂的游戏逻辑。 8. **调试与测试**:编写脚本后,必须进行详尽的测试,确保在各种情况下都能正常运行,无...

    游戏脚本源码

    在游戏中,脚本通常与游戏引擎紧密配合,通过引擎提供的API(应用程序接口)来实现各种功能。在描述中提到的"可以编译为dll",dll(动态链接库)是Windows操作系统中的共享库,用于封装一组函数或服务,供其他程序...

Global site tag (gtag.js) - Google Analytics