在XNA 4.0中管理自定义屏幕

时间:2011-05-10 12:04:00

标签: c# oop xna

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

到目前为止它工作正常,扩展这些并且使用没有问题 直到它从一个屏幕移动到另一个屏幕。 我想知道屏幕被禁用的原因,以及下一步启用的屏幕。

目前我在Screen中使用了一个int变量,主类检查实现Screen的类是否被禁用并且具有“禁用原因”int。如果是这样,它会根据该int执行操作。 我猜一个int不是最好的选择而且Enum会更好吗?

但我真正的问题是,是否有更好的方法将数据传回主类? 我是否需要轮询每个禁用的类以查看是否存在“被禁用代码的原因”?

4 个答案:

答案 0 :(得分:1)

我只会回答以下问题:

I guess that an int isn't the best choice and an Enum would be better?

即使你使用了enumation,你仍然会使用整数值,因为枚举有一个与之关联的整数值。

枚举的唯一好处是你会有原因的文字表示而不是(0,1,2,3 ..)。

答案 1 :(得分:1)

  

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

正确。制作一个枚举,例如:

enum DisabledReason { Something, SomethingElse; }
  

有没有更好的方法将数据传回主类?我是否需要轮询每个禁用的类以查看是否存在“被禁用代码的原因”?

为基本画面类添加活动 - 类似这样的内容(MSDN for EventHandler):

public event EventHandler<DisabledReason> Disabled;

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

使屏幕类在被禁用时调用Disabled事件处理程序。

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

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

答案 2 :(得分:1)

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

  

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

答案 3 :(得分:1)

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