实施属性和技能系统

时间:2014-11-26 12:20:37

标签: java game-engine

我遇到两个解决方案的问题,需要选择一个。我想知道在RPG中实现属性的正确方法是什么。让我们说它们有三个属性。 攻击防守速度。每个角色都会有这些。在某处我需要存储名称,描述和属性的值。我认为它应该在Attributes.java中完成。给我以下Attribute.java

public class Attribute
{
    private String name;
    private String desc;
    private int value;

    public Attribute (String name, String desc, int value) {
        this.name = name;
        this.desc = desc;
        this.value = value;
    }

    public String getName () { // for desc and value as well
        return name;
    }
}

现在问题是,我是否创建并存储了这些属性?

选项#1,我在这里创建它们,用它们填充ArrayList

Character.java

import java.util.ArrayList;
import java.util.List;

public class Character
{
    private List<Attribute> attributes;

    public Character() {
        attributes = new ArrayList<Attribute>();
    }

    public List<Attribute> getAttributes () {
        return attributes;
    }
}

选项#2,我创建了一个AttributeSystem

AttributeSystem.java

public class AttributeSystem
{
    private List<Attribute> attributes;

    public AttributeSystem () {
        attributes = new ArrayList<Attribute>();
        attributes.add (new Attribute ("Offensive", "Your damage.", 5);
        attributes.add (new Attribute ("Defensive", "Your defense.", 5);
        attributes.add (new Attribute ("Speed", "Your speed.", 5);
    }

    public Attribute getAttribute(int i) {
        return attributes[i];
    }
}

Character.java

public class Character
{
    private AttributeSystem attributes;

    public Character() {
        attributes = new AttributeSystem();
    }

    public AttributeSystem getAttributes () {
        return attributes;
    }
}

结论

选项#2对我来说在逻辑上更有意义。 在这两种情况下,我都可以使用HashMap而不是ArrayList。

我使用哪一个?为什么?


最后的注释

这对你的角色没有影响。它也没有能力添加属性点。暂时忽略这两个因素。

3 个答案:

答案 0 :(得分:2)

这两种选择对我来说都是合法的。 但我会将属性列表声明为静态,因为无论如何,播放器的可用属性列表都不会改变。

然后,对于每个玩家,您将每个可用属性映射到给定值。

答案 1 :(得分:1)

也许你已经过度工程了:假设这是经典的RPG,那些值(属性)的选择名称应该给你一个提示:如果你有一个Character对象,它将有属性......然后我会添加角色本身的那些属性:

class Character {
   int defensive,offensive,speed;
   ... //other attributes here, like name, race or whatever you need

}

设备,技能和其他可以变化的东西(你可以拥有一个或20个项目,你可以学习一项技能或20个......它们之间的性质可能完全不同)更有意义列表或其他相关对象。

此外,不要混淆模型和视图:每个属性的描述不应该是Character的一部分,该对象不需要那种信息,并且每次创建一个新字符时都会重复这些信息。 / p>

答案 2 :(得分:1)

我同意巴勃罗,但我想稍微扩展一下。所以我觉得这个设计对你的要求来说太元了。在那个属性是如此通用,它没有那么有用,它的灵活性阻碍你。

在设计#2中,角色永远不会改变它们的属性。它们都是5.也许这只是一个例子,但当你超越硬编码值时,使用它会变得更加麻烦。

如果每个角色都必须拥有这三个值,那为什么不是更直接的设计?与属性方案相比,这也更快,访问的代码更少。

class Character {
    int defensive, offensive, speed;
}

现在你可以使用像这样的getter方法封装像武器,盔甲等修饰符:

class Character {
    int defensive, offensive, speed;

    Item weapon;
    Item armor;
    Item shoes;

    public int getTotalDefensive() {
        return armor.getDefensive() + defensive;
    }

    public int getTotalOffensive() {
        return weapon.getOffensive() + offensive;
    }

    public int getTotalSpeed() {
        return shoes.getSpeed() + speed;
    }

    public List<Attribute> getAttributes() {
        // if you really need to work with a character like this then you can do that too.
        List<Attribute> attributes = new ArrayList<Attribute>();
        attributes.add( new Attribute( "offensive", "How much damage you can do", offensive );
        attributes.add( new Attribute( "defensive", "How much damage you can sustain", defensive );
        attributes.add( new Attribute( "speed", "How fast you can move", offensive );
        return attributes;
    }
}