动态加载Java类与实现LUA

我和一个朋友正在用Java编写一个包含大量物品的游戏。每个物品都有一些静态属性,我们将在数据库中存储它们。然而,物品也有一种特殊的能力,具有特殊的效果。通常这些效果会相当独特,因此在物品的定义中实现它们是有意义的。

由于物品存储在数据库中,我们一直在试图决定如何加载这些特殊效果。理想情况下,一个物品的定义应该像下面这样:

名称

尺寸 5

描述 如果玩家生命值低于50%,则对周围的玩家造成伤害

效果 if(currentplayer.health < 50) {entities.groups.surrounding.reduceHealth(20);}

我们一直在讨论两种不同的解决方案。第一个是以某种方式编译和存储Java代码在数据库中,另一个是实现LUA。不幸的是,我们都没有LUA的经验,不确定这是否是正确的方法。另一方面,预编译的Java解决方案似乎有些“hacky”。除此之外,我们可以预见到在大量成员调用时会出现问题,例如 a.player.head.hat.size.width.increase(1)

我想知道的是:

  • 这些方法在大量实体定义(5000+)的情况下如何比较?
  • 这里是否有明确的路径,或者是否有其他更优越的解决方案?
  • 如果将Java用作脚本语言和游戏引擎,这是否是不好的做法?
点赞
用户567864
用户567864

你考虑过创建参数化装饰器(或其他方法),并仅在数据库中存储参数而不是功能吗?这样做会使数据库布局有点更加复杂,但它将使您避免存储源代码或实现脚本语言。

例如,您可以本质上使每个“物品”实体通过特殊能力实例具有与“特殊能力”的一对多关系。此外,每个这些“特殊能力分配”都将具有与参数的一对多关系。

这意味着您可以将“Steel Sword of Rage”赋予“Rage”特殊能力,其中参数为25和200。然后,您的“Rage”装饰器将修改武器的效果,在玩家血量低于25%时增加200攻击力。

同样,您的“Mithril Sword of Rage and Bleed”可以具有30/250(当血量<= 30%时,+250 PAtk)的“Rage”特殊能力和20/10/50的“Bleed”特殊能力,其中每次攻击有20%的机会使流血,每秒造成10点伤害,并以50%的速度下降。

这当然会使您的数据库变得更加复杂(尽管我觉得它适合您所尝试做的复杂性),您将不得不滥用反射(好吧,您不必这样做 - 这只是最简单的方法[也可能是最容易维护的])。不过,幸运的是,您可以在游戏启动时仅加载物品,并且只需担心性能问题/类型检查问题一次。

2014-04-18 09:29:59
用户869951
用户869951

将下面翻译成中文并且保留原本的 markdown 格式:

根据你所发布的内容,很难说哪种更好,尽管使用 Lua 路径,你可以直接运行存储的代码,而使用 Java 路径,你需要在加载时编译 Java。

如果你搜索“在 Java 中嵌入 Lua”,你会发现几个不同的 Java 库使得从 Java 中使用 Lua 变得容易,例如 luaj、Lua java、khalua、mochalua 等。使用哪一个取决于你想要做什么的具体情况,所以你将不得不尝试其中的几个。

Lua 是一门易学的语言。

2014-04-18 12:38:57