C# 从游戏对象的定义中加载游戏对象

C# 从游戏对象的定义中加载游戏对象,c#,C#,我想从定义文件XMLs加载游戏对象,然后在游戏中使用准备好的属性(如武器、纹理、最大速度、视距等)创建它们。。我想到了IClonable接口,但它看起来很奇怪。我还需要区分部队、士兵、车辆、飞机和建筑物。听起来你想要一个可以称为特定工厂的通用工厂。通用工厂获取定义文件并确定对象的通用类型武器、单位和建筑。然后它将DOM树传递给该类型的特定工厂。武器工厂知道如何制造系统中所有不同的武器。它将DOM树传递给武器的构造器,以便构造器可以获得所有细节 如何编写这些工厂取决于XML的外观和自动化程度。你需

我想从定义文件XMLs加载游戏对象,然后在游戏中使用准备好的属性(如武器、纹理、最大速度、视距等)创建它们。。我想到了IClonable接口,但它看起来很奇怪。我还需要区分部队、士兵、车辆、飞机和建筑物。

听起来你想要一个可以称为特定工厂的通用工厂。通用工厂获取定义文件并确定对象的通用类型武器、单位和建筑。然后它将DOM树传递给该类型的特定工厂。武器工厂知道如何制造系统中所有不同的武器。它将DOM树传递给武器的构造器,以便构造器可以获得所有细节

如何编写这些工厂取决于XML的外观和自动化程度。你需要提供更多的细节来得到更具体的答案

编辑:现在我明白了。您希望将XML文件用作将来创建对象的模板。您需要一个通用的车辆对象。加载直升机的XML文件,它创建了一个新的车辆类,而实际上没有创建一个类,对吗

因此,您创建了一个车辆类别,所有车辆都从该类别派生。然后创建一个车辆模板类,所有模板都从该类派生。XML用于实例化模板类。模板类用于实例化实际对象

class vehicle_template {
     vechicle_template(xmlstreamthing x);
     // properties found in vehicles, set from xml
};
class vehicle {
     vechicle(vehicle_template v);
     // properties vehicles have, taken from template
};
vehicle vehicle_factory(string s) {
    static map<string,vehicle_template> already_loaded;
    vehicle_template vt = already_loaded.find(s);
    if (vt == null) {
        xmlstreamthing xml = get_xml_from_object_name(s); // you need to figure this part out
        if (xml == null) {
            throw no_such_vehicle(s);
        }
        vt = new vehicle_template(xml);
        already_loaded.add(s,v);
    }
    return new vehicle(vt);
}
显然,这不是可运行的代码,但它应该让您开始

我不知道如何让这些对象表现出不同的行为,但这应该可以解决您的加载问题。也许您需要一种duck类型的语言,以便在运行时向对象添加方法。

。它没有区分浅复制和深复制


我想你想要的是。

你的问题是什么?如何设计这个系统。jmucchiello已经回答了泛型工厂调用特定工厂的问题,但我想只解析定义文件一次,最好是在StartupThank,但我想避免在创建对象时反复解析定义文件。您不会反复解析它。您可以在第一次加载时将其转换为DOM树。然后将树传递给每个工厂,直到它到达构造函数。然后,构建DOM树的原始工厂会破坏该树。解析一次,遍历几次,但当它破坏DOM树时,它必须在创建另一个对象时再次创建它。我在考虑基于字符串id的对象定义并保留字典之类的东西。字典更有意义。阅读XML,然后扔掉它。尽管如果您的对象数据不能完全由一组键/值对表示,那么您将需要一些其他方式来存储对象原型。