繁体   English   中英

保存相关常数的最佳实践?

[英]Best practice for saving related constants?

在我的游戏中,我有一个带有不同GameEntityType的枚举(长约200个GameEntityType

保存游戏后,仅将GameEntityType数组写入保存文件。

为了重建游戏世界,并显示有关GameEntityTypes各种信息,我需要列出很多其他细节(常量值)。 这意味着每个GameEntityType都有与其关联的其他值。 这些值经常在每个帧中访问。 我的目标是要有一种简单的方法来从GameEntityTypeID(枚举)中获取所有额外的信息。 例如,当我从保存文件中读取0x1时,我可以简单地从数组中访问Name和所有其他包含数字/枚举的信息,例如:“ Constants.TextureList [ GameEntityType ]”,将返回字符串"Stone_Texture.DDS"

第一个枚举项的附加/关联信息的示例:

类型: string ,字符串, Flag-Enum: "Visual-Classification"boolbool值: "StoneBlock""Stone_Texture.DDS"0x0102falsetrue

我的第一种方法是创建一个静态GameEntityTypeInfo类,该类的每个其他信息类型都具有如下成员:

public static const string [] = {“ StoneBlock”,... [more entrys] };

当然,这是一个糟糕的解决方案,因为我不能随便添加GameEntityType,而不必更新所有其他列表。 我还必须将逻辑单元分成数据类型单元(这是一个问题!因为当我决定不再需要特定的EntityType时,必须经过6个以上的列表!)

接下来,我试图通过从这些数据集中构造一个结构并将其添加到静态数组来解决此问题。 但是,在构造函数(游戏开始时)期间使用附加信息创建List似乎并不是最佳解决方案。

问题:如何创建快速的(每帧至少要进行5000次名称/分类查找),并且易于访问(最好使用索引器)这些常数值?

与此类似的查找最好是“ Constants.TextureList [ GameEntityType ]”

通过子类化:

public abstract class Enumeration : IComparable
{
private readonly int _value;
private readonly string _displayName;

protected Enumeration()
{
}

protected Enumeration(int value, string displayName)
{
    _value = value;
    _displayName = displayName;
}

public int Value
{
    get { return _value; }
}

public string DisplayName
{
    get { return _displayName; }
}

public override string ToString()
{
    return DisplayName;
}

public static IEnumerable<T> GetAll<T>() where T : Enumeration, new()
{
    var type = typeof(T);
    var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);

    foreach (var info in fields)
    {
        var instance = new T();
        var locatedValue = info.GetValue(instance) as T;

        if (locatedValue != null)
        {
            yield return locatedValue;
        }
    }
}

public override bool Equals(object obj)
{
    var otherValue = obj as Enumeration;

    if (otherValue == null)
    {
        return false;
    }

    var typeMatches = GetType().Equals(obj.GetType());
    var valueMatches = _value.Equals(otherValue.Value);

    return typeMatches && valueMatches;
}

public override int GetHashCode()
{
    return _value.GetHashCode();
}

public static int AbsoluteDifference(Enumeration firstValue, Enumeration secondValue)
{
    var absoluteDifference = Math.Abs(firstValue.Value - secondValue.Value);
    return absoluteDifference;
}

public static T FromValue<T>(int value) where T : Enumeration, new()
{
    var matchingItem = parse<T, int>(value, "value", item => item.Value == value);
    return matchingItem;
}

public static T FromDisplayName<T>(string displayName) where T : Enumeration, new()
{
    var matchingItem = parse<T, string>(displayName, "display name", item => item.DisplayName == displayName);
    return matchingItem;
}

private static T parse<T, K>(K value, string description, Func<T, bool> predicate) where T : Enumeration, new()
{
    var matchingItem = GetAll<T>().FirstOrDefault(predicate);

    if (matchingItem == null)
    {
        var message = string.Format("'{0}' is not a valid {1} in {2}", value, description, typeof(T));
        throw new ApplicationException(message);
    }

    return matchingItem;
}

public int CompareTo(object other)
{
    return Value.CompareTo(((Enumeration)other).Value);
}
}

此处的文章: http : //www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/12/enumeration-classes.aspx

不知道我是否完全了解您要尝试的内容,但是如果您正在快速查找中,听起来好像您正在寻找的是Dictionary<string, List<string>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM