如何在RPG等Java游戏中定义项目?


21

我在用Java随意开发一个RPG类型的游戏,但是我在弄清楚如何拥有可以做很多不同事情而不需要为每个物品创建不同类的物品时遇到了麻烦。

例如,如何创建可以砍树和攻击怪物的斧头?

如果我扩展斩波类或武器类,则无法扩展其他类。

如果我有斩波和武器作为接口,那么当匕首也可以攻击怪物而另一把斧头可以砍伐树木时,我将有很多重复的代码。

我希望有一种方法可以拥有一个Item类,并从文件中加载项目及其各自的功能。如果可能的话,怎么办?如果不是,那么在游戏中拥有道具的最佳方法是什么?

Answers:


15

对于如何构造项目实例以执行多个角色,Gregory Weir的答案是我最喜欢的。

要从文件加载:

首先,使用YAML。YAML是一种功能强大的数据描述语言;它可以被相对快速地解析,由人类读取和编辑,支持二进制数据,并且对于大多数编程语言(包括Java)都存在库。这解决了“如何将文件中的数据存储到对象中?”

其次,使用flyweight模式您从这些文件中读取的大多数数据都是静态的。它不会因每个实例而改变(“斧头造成1d10基础伤害,但会击碎木头而不是石头” –玩家拥有的所有五个轴都是如此)。您实际从YAML文件中读取的是这些柏拉图式的定义,并且您的单个商品实例具有对这些商品的无所有权(和常量)引用,以及按实例数据,例如“我摔破前有多少摆动?”,“玩家给了吗?我有一个自定义名称吗?”,依此类推。

通过在单个对象中共享跨实例数据,您可以保留大量内存,并且可以轻松更新项目而不会保留游戏状态(保存游戏或玩家数据库)。

因此,您的类结构如下所示:

  • class Item-每个项目一个实例
    • 拥有武器实例
    • 拥有工具实例
    • 具有-自定义名称等
  • 武器类-(最多)每件一个实例
    • 是-ItemComponent
    • 指代WeaponDef
    • 有-附魔等级等
  • 类工具-每个项目(最多)一个实例
    • 是-ItemComponent
    • 引用ToolDef
    • 具有耐久性等
  • WeaponDef类-每种武器一个实例
    • 从文件读取,字段应为常数。
    • 基本伤害值,1或2手等
  • ToolDef类-每种工具一个实例
    • 从文件读取,字段应为常数。
    • 具有基本耐用性,可能破裂的材料等。

18

Component(不是Composite)设计模式非常适合此目的:http : //gameprogrammingpatterns.com/component.html

基本上,Ax将是包含WeaponComponent和ToolComponent(可能是)的Item类的实例。要测试是否可以将某物用作武器,请检查其是否已附加WeaponComponent,然后与该WeaponComponent实例进行交谈以获取该物品的武器信息。

当然,从文件加载是一个单独的练习。


当然,一旦有了组件,就可以再次充分利用接口。您的Ax类型可以实现IChopper和IWeapon,但随后可以为其公开组件的行为,从而使您可以根据需要重用类型和实现,并进行组件测试。如果所有轴都具有相同的功能但统计数据不同,那么您就很聪明。如果您需要物品具有独特的功能,则可能需要实现游戏组件集合,并使更新例程查询对象,以了解它们可以通过存在哪些组件来做什么。
CodexArcanum 2010年

6
@CodexArcanum:“您的Ax类型可以实现IChopper和IWeapon,但随后可以公开其组件的行为”-这有什么意义?它只会使您的类层次结构膨胀。组件模式的要点是,您不需要Ax类,IChopper接口或IWeapon接口,仅需要具体的Chopper和Weapon组件,以及顶层Item。

我目前正在为我的游戏项目开发一个组件系统,实际上对模式的使用只有一个主要的抱怨。给定武器,服装和消耗品的组成部分,就不能同时是武器和服装或同样是消耗品的物品而言,一件物品在理论上可能是“腐败的”。从逻辑上讲,一个项目只能是一个“主要组件”,但是通过限制组件,您完全不需要组件系统。因此,采用其他方式却令人惊讶的系统的基本缺陷之一
Krythic
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.