从定义中加载游戏对象

时间:2009-04-23 16:27:41

标签: c#

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

2 个答案:

答案 0 :(得分:0)

听起来你想要一家可以打电话给特定工厂的普通工厂。通用工厂获取定义文件并确定对象的通用类型“武器,单位,构建”。然后它将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);
}

显然,这不是可运行的代码,但它应该让你开始。

我不知道你将如何使这些对象的行为方式不同,但这应该可以解决你的加载问题。也许您需要一种鸭式语言,您可以在运行时向对象添加方法。

答案 1 :(得分:0)

Don't implement IClonable。它没有区分浅层和深层复制。

我认为你想要的是Factory Pattern