如何为点击式冒险游戏实现命令系统?


11

我正在制作一款点击冒险游戏,目前正在尝试找出实现命令系统的最佳方法。

假设猴子岛或狂人宅邸风格的界面带有动词调色板以及场景和清单中的对象。单击这些,就可以建立一个句子来执行。

例如,您可以先单击look at然后再单击一棵树以“看树”,或者单击一个苹果,然后单击,然后单击give一个女孩,以“将苹果给女孩”。

句子有三种可能的形式:

  • verb,例如“保存”
  • verb noun例如“摘苹果”,“看看章鱼”
  • verb noun noun,例如“给疯狗狗泡菜”,“将撬棍和泡菜瓶一起使用”

在不同的情况下,我希望要执行的动作由不同的对象定义。

例如,对于give动词,可能定义了一个默认动作,使角色说出类似“我希望坚持下去”之类的东西,或者疯狗可能定义了一个动作,在该动作中它吃了您尝试给予的任何东西。

如果界面的工作方式类似于Maniac Mansion,则您可以构建该语句,然后告诉它执行(在Maniac Mansion中,通过单击该语句或再次单击最后单击的内容)。

如果要像猴子岛那样工作,该句子将在完成后立即执行,这给动词带来了问题,例如use有时可能带有一个名词,而有时又带有两个名词。

那么,您将如何实现一个处理该问题的系统?


1
动词似乎有三种类型,一种用于零个名词,另一种用于两个名词,等等。它们不是同一类宾语。您不能“用腌制罐子看着章鱼”,look单名词动词等等
。– tenpn

Answers:


10

如果您颠倒选择顺序,您可能会发现它更易于使用。因此,用户单击一个名词,然后游戏将显示可以对该名词执行的动词集。如果动词需要一个对象(即“给___”),那么游戏将在执行操作之前等待用户选择对象。

就像是:

  1. 用户单击一个芝士汉堡。
  2. 游戏显示一个菜单:“捡起,吃东西,看看,给___”。
  3. 用户选择“给___”。
  4. 游戏说“给谁?” 并等待用户单击另一个名词(或取消按钮)。
  5. 用户单击一只猴子。
  6. 游戏将芝士汉堡给猴子。

在实现方面,游戏中的每个对象都需要具有以下数据:

  1. 您可以对其应用哪些动词集。
  2. 对于动词,它允许带一个对象,可以应用哪个对象集。
  3. 对于每个动词或动词-宾语对,用户执行操作时将执行的行为。

由于语法并不是真正的嵌套或任何东西,因此您不需要像解释器模式那样复杂的东西。


在事物的建模方面和事物的界面方面都为+1。是的,主要是我同意,因为这是要这样做的方式,但是我喜欢这个答案。
drhayes 2010年

如果我们同意,那么显然我们都必须是正确的。;)
慷慨的

因此,实际上,您认为要执行的行为应始终由第一个名词定义?
SpoonMeiser 2010年

1
是的,我认为多个名词将共享行为(以便“拾取”将使用相同的代码来拾取不同的对象),但是由名词决定可以应用的动词集是有意义的对它。鉴于名词的集合非常大(游戏中的所有事物)而动词的集合很小(可能是少数操作),我认为用户首先选择一个名词是有意义的,因为这样可以使组合更进一步很快。而且,实用的是,它允许用户单击某事物以启动交互,而不是某些单词。
优厚

这有点像油门一样。
Jari Komppa

2

我提出了一个简单的解决方案。当然可以扩展。

我认为(动词,对象1,对象2)的简单列表可以解决该问题:

  • 如果玩家单击了对象(动词)“使用”,并且单击了对象“气球”,并且玩家单击了对象“泵”,并且存在三元组(“使用”,“气球”,“泵”),则您“使用了带泵的气球”
  • 有时object2会为NULL,例如在“ use helium”中(use,helium,NULL)
  • 要求玩家先点击宾语动词
  • 如果玩家点击与任何内容都不匹配的内容,则说“我做不到,这是胡说八道”
  • 当然,您应该在每次单击后检查序列是否正确。

如何处理默认值:

  • 如果第一次单击不是动词对象,则搜索可能的默认操作。
  • 存储默认值的一种方法是制作四元组(动词,object1,object2,is-default)
  • 存储它们的另一种方法是具有默认三元组列表
  • ...

一些例子:

  • (使用,气球,泵)
  • (给约翰,土豆)
  • (步行,食人鱼,NULL)
  • (使用,库存气球,泵)
  • (打开,门到屋顶,NULL),默认值....默认操作的示例

可以扩展:

  • 添加一些要触发的事件(给玩家一些东西,玩家会说“我不能做,因为我是一个强大的海盗”,开始现场表演,改变世界...)
  • 添加一些前提条件。有时,气球可能在笼子里,所以您需要表达“如果气球不在笼子里”。我想我可以用事件演算或序言来解决这个问题,或者用函数指针来解决这个问题。
  • 有时命令行中的句子不是“看着孔”,而是会改写为“看着孔”,这只需要一个变量即可:)

1

这里有两个问题:将玩家的输入解释为语法树,然后执行该树。

对于第一阶段,我将让每个动词按钮创建一个从某些动词接口派生的具体动词实例。该实例将通过其他名词或动词进行验证。如果有效,它将把名词附加到其内部语法树上,否则它将被拒绝并出现适当的错误。

每次按下按钮后,您可以询问动词树是否处于有效状态才能继续(对于Monkey Island风格的输入)。

进入第二阶段后,具体动词将负责解析其自己的树并更新游戏状态。

一个更复杂的解决方案将涉及在动词外部解析树。每个树元素将负责共同产生所需结果的小动作。这种方法将使您能够从小型构建块中提取更多紧急句子。

请查看解释器模式,以获取有关解析阶段的更多信息。


1
我认为解释球员的意见不是问题。当然,这里没有什么比解析文本冒险输入要复杂的多了。确实,问题归结为您将如何设计对象层次结构和交互,以最大程度地灵活定义哪个对象定义了要执行的实际操作。
SpoonMeiser 2010年
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.