Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XNA 4.0中管理自定义屏幕_C#_Oop_Xna - Fatal编程技术网

C# 在XNA 4.0中管理自定义屏幕

C# 在XNA 4.0中管理自定义屏幕,c#,oop,xna,C#,Oop,Xna,我正在经历建立面向对象编程技能的过程, 并编写了一个抽象的Screen类,其中包含一个更新方法(以KeyboardState和MouseState为参数)和一个draw方法(以SpriteBatch为参数)。 该类还包括一个bool isEnabled,以及启用/禁用它的方法 到目前为止,它工作得很好,扩展了这些功能,使用起来没有问题 直到从一个屏幕移动到另一个屏幕。 我想知道为什么屏幕被禁用,以及下一步要启用哪个 目前,我在屏幕中使用了一个int变量,主类检查实现屏幕的类是否被禁用,是否有一个

我正在经历建立面向对象编程技能的过程, 并编写了一个抽象的Screen类,其中包含一个更新方法(以KeyboardState和MouseState为参数)和一个draw方法(以SpriteBatch为参数)。 该类还包括一个bool isEnabled,以及启用/禁用它的方法

到目前为止,它工作得很好,扩展了这些功能,使用起来没有问题 直到从一个屏幕移动到另一个屏幕。 我想知道为什么屏幕被禁用,以及下一步要启用哪个

目前,我在屏幕中使用了一个int变量,主类检查实现屏幕的类是否被禁用,是否有一个“disabled reason”int。如果是,它会基于该int执行一个操作。 我猜int不是最好的选择,而Enum会更好

但我真正的问题是,有没有更好的方法将数据传递回主类?
我是否需要对每个残疾班级进行投票,以确定是否有“被禁用的原因代码”

我只回答以下问题:

即使使用枚举,也将使用整数值,因为枚举具有与其关联的整数值

枚举的唯一好处是,您可以使用原因的文本表示,而不是(0、1、2、3..)

我猜int不是最好的选择,而Enum会更好

对。创建枚举,例如:

enum DisabledReason { Something, SomethingElse; }
是否有更好的方法将数据中继回主类?我是否需要对每个残疾类进行民意调查,看看是否有“被禁用的原因代码”

给基本屏幕类一个事件

公共事件事件处理程序已禁用;
使主类在创建屏幕时将事件处理程序附加到屏幕

当screen类被禁用时,让它调用
Disabled
事件处理程序

结果是,当屏幕被禁用时,会通知主类为什么屏幕被禁用。您将屏幕的
this
传递给
Disabled
事件作为源参数-这样主类将知道事件来自哪个屏幕

(注意:这是一个关于使用事件的速成课程-如果需要,请对如何使用事件进行更多的研究。)

我建议“借用”Microsoft App Hub网站上的示例。这都是关于屏幕管理的。(请务必下载Windows示例-除非您正在制作手机应用程序)

ScreenManager类是一个可重用的类 维护一个堆栈的组件 一个或多个GameScreen实例。信息技术 协调从一个到另一个的过渡 屏幕切换到另一个屏幕,并处理 将用户输入路由到任意屏幕 在堆栈的顶部


即使您最终“借用”了代码来找出解决方案,您仍然可以从中获得一些好的OOP原则。EventHandler是“观察者”模式的经典示例。

谢谢你的回答:)是的,我的想法是,在代码中赋予纯整数值意义是一种不好的做法。更不用说我后来扩展它时的困惑了。我根本没有遇到过编写事件。这显然比持续的轮询更有效。你已经给了我下一个要学习的领域:P谢谢你的回答:我考虑过寻找类似的东西,但决定尝试以自己的方式作为学习练习,以更加熟悉/熟悉OOP编程。不过谢谢你的链接,在我尽我所能之后,我会看看它是如何工作的:)
enum DisabledReason { Something, SomethingElse; }
public event EventHandler<DisabledReason> Disabled;