【问题标题】:EnumMap with LuaJava (attempt to call a nil value)使用 LuaJava 的 EnumMap(尝试调用 nil 值)
【发布时间】:2014-10-18 17:47:07
【问题描述】:

正如标题所说,我对 LuaJava 和 EnumMap 有疑问。我正在尝试做一个 RPG 库,所以我们有一个带有一些属性的角色和它们的列表。在下面的代码中,我将只报告重要的事情。

我有一个名为 ConcreteAttribute 的类,它扩展了 AbstractAttribute,它有一个带有 String 和两个 int 的构造函数。

public abstract class AbstractAttribute {

protected String name;
protected int baseValue;
protected double baseMolt;

public AbstractAttribute(String name, int valoreBase, double moltBase){
    this.name = name;
    this.baseValue = valoreBase;
    this.baseMolt = moltBase;
}

/*Getters and Setters*/

}

然后我有一个名为 StatType 的 Enum,它代表你在 RPG 游戏中的统计数据:

public enum StatType {
HP, MP, Attack, Defense;
}

我还有一个名为 PlayableCharacter 的类,它有(我只会报告重要的事情):

public abstract class PlayableCharacter extends Character{

protected EnumMap<StatType, ConcreteAttribute> statistiche;

//Constructor

public EnumMap<StatType, ConcreteAttribute> getStatistiche(){
    return statistiche;
}

还有一个来自 Map 的“put”方法。

为了创建一个新角色,我目前正在这样做(“Eroe”扩展了 PlayableCharacter):

    public static void main(String[] args) {

    PlayableCharacter pers = new Eroe("Eroe 1");
    ConcreteAttribute atk = new ConcreteAttribute("Attacco", 20, 0);
    pers.getStatistiche().put(StatType.Attacco_Fisico, atk);

}

并且工作正常,但是当你有很多 ConcreteAttribute 和很多 Character 时,我认为这不是最好的解决方案。所以我想用 Lua 来创建 Character 的“具体” istance,这样(小例子):

-- Eroe 1.lua
function create(eroe)
    eroe:setName("Eroe 1")
    attributes =  luajava.bindClass("personaggi.attributi.StatType")
    attacco = luajava.newInstance("personaggi.attributi.ConcreteAttribute", "Attacco", 20, 0) 
    eroe:getStatistiche():put(attributes.Attacco_Fisico, attacco)
 end

但我收到此错误:PANIC: unprotected error in call to Lua API (attempt to call a nil value)。问题出在最后一行,但我对 Lua 真的很陌生,我什至不知道 Lua 是否可以处理 EnumMap。

有什么解决办法吗?

谢谢大家,对不起我的英语不好^^

编辑:我已经编辑了代码,我发现了一个错误

【问题讨论】:

  • 您应该将范围缩小到实际为零的实例,是attaccoattributes 还是getStatistiche()?我对lua不是很熟悉,但不应该是attributes.HP吗?枚举常量是公共成员,但看起来您将它们视为使用 : 的方法。
  • 非常感谢,看来错误正是那个“:”而不是“.”!真的,真的谢谢!现在它似乎工作了:) 你让我很开心!
  • 好的,很高兴我能帮上忙!那我就给它一个答案,所以你可以接受它:)

标签: java luajava enum-map


【解决方案1】:

一个枚举常量是它的枚举类的公共成员,但是你像使用:的方法一样访问它。

因此,您需要使用attributes.Attacco_Fisico,而不是attributes:Attacco_Fisico

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 2022-11-23
    • 2011-07-30
    • 2017-04-03
    • 2018-05-30
    • 2019-09-15
    • 2013-05-12
    • 2016-05-09
    相关资源
    最近更新 更多