Answers:
您的游戏故事可能应该采用有限状态自动机(或某种扩展的FSA)形式。当某些事件发生时,您应该移至新状态。这样,您只需要存储当前状态以及需要什么信息就可以知道FSA下一步要移动到哪里(以及位置,健康状况等玩家详细信息)。
例如,如果我们绝对简化了《口袋妖怪》游戏,那么健身房徽章就构成了FSA的主要分支。您从没有徽章的状态0开始,当您击败体育馆领袖时,您要经过状态,状态1,状态2等。要使游戏实体更新到当前状态,您只需要获取他们看一下当前状态。例如,第三体育馆外面的NPC会检查您处于哪个状态,看到您处于与拥有3个徽章相对应的状态,并做出相应的响应(也许用“做得好!”)。
您无需存储世界上所有事物的状态。只是故事的状态。实体本身知道如何根据当前状态做出反应。
您可以使用一组可能的游戏状态。您的NPC和您的世界会意识到这些状态并做出相应的反应/显示。您可能还想定义一组可由某些操作/事件激活的触发器。
例如,击败某个对手将激活触发器A,这将为您的世界添加状态S,并且在状态S中,当角色从其对手巢穴中走出来时,他会被电死。或者外面正在下雨。或者,您会找到一种稀有的糖果。你明白了。
在游戏中添加了这两个简单的附加项之后,您就可以使其更加“活跃”。
确保您还为自己的世界,角色和故事情节创建了丰富的背景,并确保游戏与该背景保持一致。首先计划您的故事。
也尝试Gamedev
如sftrabbit所述,这是状态机的完美应用。
本质上,您具有某种树结构。每个叶/节点包含有关当前状态的信息,以及进入下一个状态的规则。每个节点可能包含多个出口,具体取决于您所需的情节/游戏流程的复杂程度。
一个很好的,非常宽松的类比是《选择自己的冒险》一书。每页包含一些描述故事一部分以及玩家可以做出的决定的文本。每个决定都指向另一个页面。某些页面可能链接回先前访问的页面,等等。
诸如Zork和Phobos的Leather Goddesses之类的基于文本的旧冒险游戏,以及臭名昭著的Sierra * Quest游戏(SpaceQuest由我的最爱之一是Roger的空间管理员是SpaceQuest)是使用这种类型系统的非常简单的版本。地图中的每个房间都是一个州,其出口链接到其他州或房间。获取项目会在全局状态对象中设置标志。每个房间都会检查这些标志,以确定每个房间中有哪些字符或物品可用。
因此,您的状态可以实现为类或结构,每个状态都具有以下属性:
资产列表-指向背景图形的指针列表,以及显示房间/状态/水平所需的其他任何东西。
入学条件-达到某个级别所必须达到的成就
出口-指向每个可能的“下一个”出口的链接。北,南,东和西是其中的一些示例,但是您可能还包括Door1,Teleport等。当尝试退出房间或确定出口/门为“打开”状态时,您的游戏可以检查下一个状态查看是否满足其进入条件,并更改退出在屏幕上的显示方式,或者只是不允许玩家朝该方向移动。
如果您想花哨的话,可以加入具有不同进入条件的状态的不同版本,这会改变将房间呈现给玩家的方式或该房间中可用的动作。
您的开始屏幕,死亡/游戏结束屏幕等都可能是系统内的状态,类似于您可能在菜单屏幕之间导航的方式。实际上,如果您有这样的菜单系统,则可以使用它。您可以在游戏区域内寻找特定事件,而不是使用向上/向下箭头和“输入”来导航菜单,例如踩在传送垫上,从屏幕右侧离开等等。
从管理员的角度,考虑是否可以从创建允许您创建状态机的管理工具中受益。在地图上添加房间,在房间之间创建链接,分配资产(例如背景图片等)。专注于构建管理工具太容易了,而从不真正完成游戏。记住-您不是在编写中间件,而是游戏。
希望这可以帮助。
我曾经使用过称为VERGE的游戏引擎。试试看,看看它如何处理事件,我真的很喜欢。它也是开源的,因此您可以在此处查看他们的实现方式。这是一个简短的描述。
每个地图都有不同的图层。图形层,其中可能有多个。阻塞层。然后是区域层。区域层在这里很重要。*
每个磁贴都有一个数字,以指示其属于哪个区域。每个区域可以通过两种基本方式激活。要么在玩家进入区域时激活该区域,要么该区域具有所谓的相邻激活。相邻激活是指当玩家站在该区域的一个砖块附近并按下指定为激活键的某个键时,该区域将被激活。
激活区域后会发生什么,那就是从脚本中调用一个函数。因此,您需要嵌入某种脚本语言。VERGE拥有自己的语言,称为VergeC,它还允许使用lua。我自己更喜欢使用python。
一旦克服了这一障碍,您现在就可以在事件脚本中发挥巨大的作用。您拥有完善的编程语言,可以在其中存储球员的状态,故事标记等数据并对其采取行动。
*还有一个实体层。实体的行为就像移动的邻近激活区域。