在 XNA 4.0 中管理自定义屏幕

本文关键字:管理 自定义 屏幕 XNA | 更新日期: 2023-09-27 17:56:02

我正在经历建立我的OOP技能的过程,并编写了一个抽象的 Screen 类,其中包含一个以键盘状态和鼠标状态作为参数的更新方法,以及一个将 SpriteBatch 作为参数的绘制方法。该类还包括一个 bool isEnabled,以及启用/禁用它的方法。

到目前为止,它工作正常,扩展了这些并且使用没有问题直到从一个屏幕移动到另一个屏幕。我想知道为什么屏幕被禁用,以及接下来要启用哪个屏幕。

目前我在 Screen 中使用了一个 int 变量,主类检查实现 Screen 的类是否被禁用并且具有"禁用原因"int。 如果是这样,它会基于该 int 执行操作。我想 int 不是最佳选择,而枚举会更好?

但我真正的问题是,有没有更好的方法将数据中继回主类?我是否必须轮询每个禁用的类以查看是否存在"被禁用代码的原因"?

在 XNA 4.0 中管理自定义屏幕

我只会回答以下问题:

I guess that an int isn't the best choice and an Enum would be better?
即使使用枚举,

您仍将使用整数值,因为枚举具有与之关联的整数值。

枚举的唯一好处是您将对原因进行文本引用,而不是 ( 0, 1, 2,3 .. )。

我想 int 不是最佳选择,而枚举会更好?

正确。创建一个枚举,例如:

enum DisabledReason { Something, SomethingElse; }

有没有更好的方法将数据中继回主类?我是否必须轮询每个禁用的类以查看是否存在"被禁用代码的原因"?

为基屏幕类提供一个事件 - 如下所示(MSDN for EventHandler):

public event EventHandler<DisabledReason> Disabled;

使主类在创建屏幕时将事件处理程序附加到屏幕。

使 screen 类在禁用时调用 Disabled 事件处理程序。

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

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

我建议从Microsoft应用中心网站上的游戏状态管理示例中"借用"。这一切都与屏幕管理有关。 (请务必下载适用于 Windows 的示例 - 除非你正在制作手机应用)。

ScreenManager 类是可重用的 维护堆栈的组件 一个或多个游戏屏幕实例。它 协调从一个过渡 屏幕到另一个,并照顾 将用户输入路由到任何屏幕 位于堆栈顶部。

即使你最终"借用"代码来找出解决方案,你仍然可以从中获得一些好的OOP原则。 事件处理程序是"观察者"模式的典型示例。