首先,让我为提出一个看起来有点模糊(或形式不正确)的问题而道歉,但我没有经验可以提出更具体的问题.
我正在构建一个引擎,用于在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:由于我仍然处于概念层面并且上面的代码尚未实现,因此您可以自由地建议您找到的最佳解决方案,即使是完全避免代理的解决方案.
c# ×1