游戏故事事件编程


28

我用c / c ++和DirectX开发了一个游戏引擎。

我有一个用于地图的图块引擎,动画播放器/ npc精灵,与npc对话,菜单和级别更改,但没有游戏,只是感觉很空。

我环顾四周,不断听到流行语的答案,但我想知道如何在游戏中实现一个故事。

有人说过一个保存文件,其中包含用于控制游戏中所有可能的动作/状态的标志,但这听起来很荒谬。

这有点雄心勃勃,但我的目标是让游戏像老式的Pokemon / Final Fantasy游戏一样。

有谁知道这些游戏的运作方式或所使用的理论吗?

我已经寻找了一段时间,非常感谢人们的投入。

Answers:


19

您的游戏故事可能应该采用有限状态自动机(或某种扩展的FSA)形式。当某些事件发生时,您应该移至新状态。这样,您只需要存储当前状态以及需要什么信息就可以知道FSA下一步要移动到哪里(以及位置,健康状况等玩家详细信息)。

例如,如果我们绝对简化了《口袋妖怪》游戏,那么健身房徽章就构成了FSA的主要分支。您从没有徽章的状态0开始,当您击败体育馆领袖时,您要经过状态,状态1,状态2等。要使游戏实体更新到当前状态,您只需要获取他们看一下当前状态。例如,第三体育馆外面的NPC会检查您处于哪个状态,看到您处于与拥有3个徽章相对应的状态,并做出相应的响应(也许用“做得好!”)。

您无需存储世界上所有事物的状态。只是故事的状态。实体本身知道如何根据当前状态做出反应。


有趣的方法,我喜欢它必须尝试一下,但是您将如何跟踪不依赖故事进度的边线任务?

这实际上取决于您的故事的复杂程度。拥有多个FSA(每个子故事一个)最简单,或者您可能需要一些复杂的分支。您需要坐下来,将自己的故事作为路线图。当您了解所有事物如何交织在一起时,请考虑如何存储当前状态(或声明是否可以一次存储多个状态)。有些东西需要分开存储,例如NPC的位置(如果需要保存它们)和某些角色的健康状况,因为它们与故事无关。

您谈论的这个FSA,我在哪里可以找到对此的解释,最好是简化而没有其他理论交织在一起。
Skeith

您可以在各处了解有关状态机的所有信息,但是99.9%的时间不会谈论游戏。一本关于计算的入门书将教您有关计算的知识,但您实际上并不需要那么多的细节。您只需要了解状态的概念,并在发生某些事件时在状态之间移动即可。@pwny的回答实际上只是以不同的方式说同一件事。但是,阅读有关FSA的知识将是学习状态机概念的好方法。只是谷歌对状态机的介绍!
约瑟夫·曼斯菲尔德

7

您可以使用一组可能的游戏状态。您的NPC和您的世界会意识到这些状态并做出相应的反应/显示。您可能还想定义一组可由某些操作/事件激活的触发器。

例如,击败某个对手将激活触发器A,这将为您的世界添加状态S,并且在状态S中,当角色从其对手巢穴中走出来时,他会被电死。或者外面正在下雨。或者,您会找到一种稀有的糖果。你明白了。

在游戏中添加了这两个简单的附加项之后,您就可以使其更加“活跃”。

确保您还为自己的世界,角色和故事情节创建了丰富的背景,并确保游戏与该背景保持一致。首先计划您的故事。

也尝试Gamedev


这是可能的,但我确信专业人员会更好,因为您所追求的需要数十万个布尔值和整数(我已经尝试过)。我只是不认为这是大型游戏的现实方法。感谢您的链接

不必想象5个独立的可叠加状态。您可以获得5个布尔值的32个可能的分支。我认为这是合理的。此外,触发器系统还用于许多专业游戏中,尤其是因为您随后可以使用一系列触发器来编写行为脚本。
pwny 2011年

2

如sftrabbit所述,这是状态机的完美应用。

本质上,您具有某种树结构。每个叶/节点包含有关当前状态的信息,以及进入下一个状态的规则。每个节点可能包含多个出口,具体取决于您所需的情节/游戏流程的复杂程度。

一个很好的,非常宽松的类比是《选择自己的冒险》一书。每页包含一些描述故事一部分以及玩家可以做出的决定的文本。每个决定都指向另一个页面。某些页面可能链接回先前访问的页面,等等。

诸如ZorkPhobos的Leather Goddesses之类的基于文本的旧冒险游戏,以及臭名昭著的Sierra * Quest游戏(SpaceQuest由我的最爱之一是Roger的空间管理员是SpaceQuest)是使用这种类型系统的非常简单的版本。地图中的每个房间都是一个州,其出口链接到其他州或房间。获取项目会在全局状态对象中设置标志。每个房间都会检查这些标志,以确定每个房间中有哪些字符或物品可用。

因此,您的状态可以实现为类或结构,每个状态都具有以下属性:

资产列表-指向背景图形的指针列表,以及显示房间/状态/​​水平所需的其他任何东西。

入学条件-达到某个级别所必须达到的成就

出口-指向每个可能的“下一个”出口的链接。北,南,东和西是其中的一些示例,但是您可能还包括Door1,Teleport等。当尝试退出房间或确定出口/门为“打开”状态时,您的游戏可以检查下一个状态查看是否满足其进入条件,并更改退出在屏幕上的显示方式,或者只是不允许玩家朝该方向移动。

如果您想花哨的话,可以加入具有不同进入条件的状态的不同版本,这会改变将房间呈现给玩家的方式或该房间中可用的动作。

您的开始屏幕,死亡/游戏结束屏幕等都可能是系统内的状态,类似于您可能在菜单屏幕之间导航的方式。实际上,如果您有这样的菜单系统,则可以使用它。您可以在游戏区域内寻找特定事件,而不是使用向上/向下箭头和“输入”来导航菜单,例如踩在传送垫上,从屏幕右侧离开等等。

从管理员的角度,考虑是否可以从创建允许您创建状态机的管理工具中受益。在地图上添加房间,在房间之间创建链接,分配资产(例如背景图片等)。专注于构建管理工具太容易了,而从不真正完成游戏。记住-您不是在编写中间件,而是游戏。

希望这可以帮助。


在这个例子中,伊玛涅是一个小镇。我有一个文件,其中包含磁贴布局以及图形和大小,npc列表以及类似的常规内容。通过添加文件,可以在游戏中添加一个新的城镇,允许其他人做出贡献,或者按原计划进行,但是文件变得有些完整和复杂。如果我了解您,我会在该文件中将可能发生在所述城镇中的事件标记为跟踪进度?
Skeith

@Skeith是的,这听起来很合理。
3Dave 2011年

0

我曾经使用过称为VERGE的游戏引擎。试试看,看看它如何处理事件,我真的很喜欢。它也是开源的,因此您可以在此处查看他们的实现方式。这是一个简短的描述。

每个地图都有不同的图层。图形层,其中可能有多个。阻塞层。然后是区域层。区域层在这里很重要。*

每个磁贴都有一个数字,以指示其属于哪个区域。每个区域可以通过两种基本方式激活。要么在玩家进入区域时激活该区域,要么该区域具有所谓的相邻激活。相邻激活是指当玩家站在该区域的一个砖块附近并按下指定为激活键的某个键时,该区域将被激活。

激活区域后会发生什么,那就是从脚本中调用一个函数。因此,您需要嵌入某种脚本语言。VERGE拥有自己的语言,称为VergeC,它还允许使用lua。我自己更喜欢使用python。

一旦克服了这一障碍,您现在就可以在事件脚本中发挥巨大的作用。您拥有完善的编程语言,可以在其中存储球员的状态,故事标记等数据并对其采取行动。

*还有一个实体层。实体的行为就像移动的邻近激活区域。


听起来像是rpg游戏制造商系列所使用的那种系统。但是如果该图块根据您的故事距离有5个不同的事件怎么办?
Skeith

@Skeith不能。每个图块只有一个与之关联的区域。每个区域只有一个调用的脚本函数。但这不是问题。请记住,您这里使用的是成熟的编程语言。有关您经历的故事的信息将存储在一个或多个变量中。因此,确定要执行的操作很简单,只需在脚本中测试该变量,然后根据其值采取适当的措施即可。
本杰明·林德利

@Skeith:尽管您可以添加更改磁贴所属区域的选项。
本杰明·林德利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.