我正在使用XNA进行编程,需要有关组织我的类和代码的帮助: 我有一个按钮类和一个按钮管理器。 我还有一个场景类和场景管理器。
按钮管理器处理将在不同屏幕上绘制的不同按钮,因为几乎所有屏幕都有一个按钮。 场景管理器做同样的事情,除了处理按钮它处理只需要绘制的背景场景对象。 两位经理都依赖当前的游戏状态来确定要绘制的按钮或场景对象。
我应该如何组织我的代码,以便两位经理都知道当前的游戏状态是什么? (两个经理都在主游戏类中实例化,两个经理都是游戏组件)
答案 0 :(得分:2)
您正在寻找的关键字描述您的问题是“游戏状态管理”XNA网站上有一些很好的文章,请务必阅读以下内容:http://create.msdn.com/en-US/education/catalog/sample/game_state_management
现在更直接地回答你的问题。假设您有2种不同的状态 -菜单 - 游戏
首先创建一个名为State的类,其中包含设置绘图和更新正确UI元素的方法。
现在创建一个从State派生的类MenuState,并覆盖setup,draw和update方法。在setup方法中,将所有代码生成为正确的菜单。 (如Scene.MenuItems.Clear(); Scene.MenuItems.Add(new Label(..)); etc ..)。对更新和绘制方法执行相同的操作(更新和绘制每个控件,捕获按钮点击等给出的事件......)
为GameState做同样的事。
现在在场景代码中创建一个字段“State state”。当用户将转义集状态按到(新)MenuState时。当用户将游戏设置状态返回到(新的)GameState时。在场景的更新和绘制方法中,调用state.Update(..)和state.Draw(..)。因为您在GameState和MenuState中覆盖了这些方法,所以将执行正确的操作。
这种方法解决了使用像“if(scene.StateEnum == StateEnum.SomeState){DoThis();}”这样的检查的gazzillion控件的问题。您会发现这种方式更易于管理。
还要考虑构建其他概念类。就像MenuState可以有一个子状态“选项菜单”。也许想起一个表格等等......
答案 1 :(得分:0)
SInce GameComponent有一个Game属性,您可以使用它来投射到Game类,或者让服务公开游戏状态。