游戏(例如Oblivion)的任务如何建模?

时间:2011-09-07 23:07:12

标签: design-patterns logic game-engine

我几天前刚刚开始玩 Elder Scrolls IV:Oblivion ,有一件事我不禁想知道如何以编程方式处理任务系统?

具体来说,游戏中有许多(数百?)个任务甚至是子任务,所有这些任务都以多种方式反映在游戏环境中:从特定时间/地点在游戏中发生的脚本事件在特定的人之间(假设他们还活着),相关的任务项目(其中一些与特定的NPC和任务的状态相关联),与不同NPC的不同对话(同样,复杂的树可以通过改变与其他NPC对话以及任务的一般状态。)

此外,您可以在任何时候在活动/非活动任务之间进行切换,因此这些复杂的动态行为会从根本上影响您周围的环境,因此可以完全互换。

这似乎是一个合乎逻辑的梦魇,我很难掌握如何以编程方式定义如此深刻和丰富的东西,所以看似完美无瑕。

是否有任何有此类经验的人可以(广泛地)解释这些系统的内容?

3 个答案:

答案 0 :(得分:1)

我只是在这里猜测。没有做过这种编程,但我在玩 RuneScape 时已经考虑了很多关于他们是如何做的。

可能有一堆与您的帐户相关联的标记和变量,当您完成任务时,它们的值会发生变化。首先,角色X被标记为活着,在位置Y.后来,她被标记为位置Z.然后,她已经死了。因此,当您输入位置Y时,它会检查变量以查看她是否存在,并将其对象放在那里。与此同时,另一位尚未开始任务的玩家可以在同一区域内完全看到别的东西。

答案 1 :(得分:1)

我不是游戏设计师,但我可以看到可能在这里工作的东西......

Object Oriented Programming通过将数据和逻辑整齐地封装在许多对象中来实现这种复杂性和动态性。这些对象可以“口头”交互,使用对象间消息传递将任务委派给彼此。消息的发送者不需要知道接收者将如何解释消息,将操作方法​​完全留给接收者。就像在现实世界中一样,委托允许事情更顺利地运行。

例如,当您从纽约市的Del Posto订购蘑菇烩饭时,您是通过走回厨房并直接与厨师交谈来订购的吗?你是否穿上围裙并自己准备意大利调味饭?你开车去最近的蘑菇农场挑选自己的蘑菇吗?不,你没有。您只需将这些任务分别委托给服务员,厨师团队和农产品供应商。要获得蘑菇烩饭,您需要做的就是告诉服务员您想要它。其余的通过一系列授权自动完成。你的游戏中可能存在同样的授权。

现在,回到对象。有些对象从父对象继承数据和逻辑,这样就可以共享大量的数据/逻辑;让我们称这些兄弟姐妹。在游戏任务的示例中,每个任务可能是其自己的“任务对象”,其基线数据和逻辑继承自父“任务父”。可以通过增加与特定任务相关的额外数据/逻辑来区分Quest兄弟姐妹。

根据您在游戏中的操作(以及您在游戏菜单中的选择,可能),游戏对象可以为其中一个兄弟姐妹换出一个活动任务对象。通常,这可以通过一个非常简单的命令来完成(在伪代码中,不是在任何特定的编程语言之后建模):

gameObject.activeQuest -> getCurrentObject(); 
//returns the object containing all of the data/logic of the current active quest:
Gibbons_GoldenArtifacts
//Let's say the quest description is "Scour the Catacombs of Gibbon for a 
mysterious treasure"

gameObject.activeQuest -> setCurrentObject(Gibbon_DefeatGhost)
//sets the activeQuest object (note that QUEST OBJECT contains baseline data/logic)
//assuming, say, Gibbon_DefeatGhost is an object like so:

Gibbon_DefeatGhost={QUEST OBJECT};
Gibbon_DefeatGhost.extend(
    description="Defeat Gibbon's ghost to retrieve his golden artifacts";
    objective="Defeat Gibbon's ghost";
    questNPC="Gibbon's ghost";
    questLocation="Gibbon's Inner Sanctum"
    questTriggers[1]="When PLAYER enters Gibbon's Inner Sanction: Release Gibbon's ghost"; 
    questTriggers[2]="When Gibbon is slain: Drop Gibbon's golden artifacts"
)

从那时起,游戏对象本身可能会与活动任务对象进行相同的交互,但主动任务对象可能会以与兄弟任务对象的方式不同的方式感知这些交互,从而产生在不同的游戏体验中。

希望我不是完全捏造这个小丑...

答案 2 :(得分:0)