C#2D游戏中对象的结构

Maj*_*mic 5 c#

首先,让我为提出一个看起来有点模糊(或形式不正确)的问题而道歉,但我没有经验可以提出更具体的问题.

我正在构建一个引擎,用于在C#中玩2D冒险游戏(你点击一个对象和事物发生排序),我正在考虑它的最佳结构.你可以想象,当你与一个物体互动时会发生不同的事情:如果它是一扇门,你希望进入另一个房间,如果它是一个人,你希望开始与他们交谈,等等.我的想法是实现这个行为代表们,像这样:

public abstract class GameObject {
    public delegate void onAction();
    public onAction Click;
}

public class Door : GameObject {
    public Door() {
        Click = new onAction(ChangeRoom);
    }
    private void ChangeRoom() {
        //code to change room here
    }
}

public class Person : GameObject {
    public Person() {
        Click = new onAction(StartTalking);
    }
    private void StartTalking() {
        //code to display dialogue here
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现这个解决方案非常优雅,因为如果我想创建一个特殊对象,其行为不属于其类,我可以简单地这样做:

specialObject.Click += new onAction(SpecialMethod);
Run Code Online (Sandbox Code Playgroud)

但这也是事情变得复杂的地方.我希望我的引擎能够简单地通过加载不同的数据来播放不同的游戏,而无需更改引擎本身,因此在引擎内部的某处硬编码SpecialMethod不是一个选项,它必须是数据的一部分.对于普通对象,它都可以用(反)序列化来完成,但从我读过的内容来看,这对代表来说是个问题.你能建议一种方法吗?

PS:由于我仍然处于概念层面并且上面的代码尚未实现,因此您可以自由地建议您找到的最佳解决方案,即使是完全避免代理的解决方案.

Ale*_*eks 1

首先,当你缺乏经验时编写引擎可能比你想象的更难。我建议你根据需要编写第一个没有引擎和硬编码的游戏,然后从经验中学习并编写你的引擎......我知道这不是你想要的:D

如果您还没有检查过,请访问http://www.adventuregamestudio.co.uk/,使用编辑器并思考下面的对象模型。我会帮你的。

由于您希望游戏是数据驱动的,因此您必须能够动态加载和执行代码。“它不一定是一种脚本语言。” 建议您在学习如何构建引擎的同时添加脚本语言并学习它,这违背了我的本性。.NET Framework 有一个很棒的反射系统,允许您加载 C# 代码并在运行时编译它。我必须指出,这是一种 C# 脚本,但缺乏脚本语言的正确定义。

由于您在这方面没有太多经验,我的建议是使用 XML 文件来定义您的房间,并具有基本的节点序列(命令)来定义单击某些内容时应该发生的情况。您应该在“引擎”中执行所有命令,但您将能够轻松创建新房间,从而创建类似的游戏。XML 也是一种非常可扩展的方法,因为它的层次结构允许您添加条件、循环等,从而扩展引擎的“脚本”功能。