Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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# XNA4.0中的UI开发书籍_C#_User Interface_Xna 4.0 - Fatal编程技术网

C# XNA4.0中的UI开发书籍

C# XNA4.0中的UI开发书籍,c#,user-interface,xna-4.0,C#,User Interface,Xna 4.0,我希望为我正在开发的游戏开发一个基本(最初)自定义UI。它将用于游戏本身以及修改工具。我已经看过了游戏状态管理示例,但它只给出了一堆代码,没有真正解释为什么事情会发生。我的学习风格是这样的,如果我真的要理解一些东西,我必须先知道为什么,然后才能理解如何。这就是为什么我想要一本书,而不是下载另一个代码示例 我可以创建UI对象的可视部分,没有任何问题(简单的部分),我知道如何使用它们(与事件处理程序一起),但我很难连接通过按键或鼠标单击XNA屏幕上的按钮触发的事件处理程序 任何关于书籍或在线教程/讲

我希望为我正在开发的游戏开发一个基本(最初)自定义UI。它将用于游戏本身以及修改工具。我已经看过了游戏状态管理示例,但它只给出了一堆代码,没有真正解释为什么事情会发生。我的学习风格是这样的,如果我真的要理解一些东西,我必须先知道为什么,然后才能理解如何。这就是为什么我想要一本书,而不是下载另一个代码示例

我可以创建UI对象的可视部分,没有任何问题(简单的部分),我知道如何使用它们(与事件处理程序一起),但我很难连接通过按键或鼠标单击XNA屏幕上的按钮触发的事件处理程序

任何关于书籍或在线教程/讲座的建议都会很好。虽然代码示例很受欢迎,但如果没有附带的教程或书籍,代码示例并没有多大帮助。另一方面,没有源代码的教程或书籍对我也不是很有用。另外,请不要使用ziggyware教程。我爱他们,但他们很沮丧:(

编辑:

我想到的另一种方法(但不太喜欢)是,当菜单弹出时,它会暂停游戏(如果需要)并显示菜单。然后,每当单击鼠标时,它都会检查鼠标单击的坐标,并检查它们是否与其中一个菜单项相交。这是可能的,但看起来太乱了,我觉得我应该能够进入事件处理程序。事实上,我知道我可以,因为游戏状态管理Sampl我用过它们,虽然我不清楚怎么用

链接


通过使用本教程,我能够理解如何在xna中使用带有自定义控件的事件。第3部分讨论了如何制作按钮,这对我帮助最大。然后,我看到它引用了游戏状态管理示例(InputState)中的一个类。我再次通读了InputState以及第三部分中使用它的代码,我觉得我对它理解得相当透彻。

正如我在评论中所说的,一般来说,您可以扩大对游戏中GUI的搜索范围。我不知道有任何XNA特定的书籍,因此下面是从GSM示例中获取的一般想法的快速概述(我手头没有,所以类名等可能有点不对劲)

另请参见:另一个stack exchange站点上的GameDev。
另请参见:GSM示例附带的文档(MS Word)


概述: GSM示例使用的一种通用方法是屏幕堆栈的概念

屏幕定义用户当前可以看到的内容,例如选项屏幕、帮助屏幕或游戏屏幕

管理屏幕: 在GSM的情况下,经理
ScreenManager
负责管理要绘制的屏幕以及绘制的时间。
通过这种方式,它管理游戏的“状态”

游戏的基本状态由一堆屏幕定义。当用户钻入一个选项/菜单项时,它可能会创建一个新屏幕并将其推到堆栈上。当用户按下后退键时,它将退出

这里的关键是只渲染顶部屏幕(GSM实际上渲染的不仅仅是顶部屏幕,以支持屏幕过渡,即淡入淡出屏幕等)。但输入仅由最顶部的屏幕处理

管理输入 您有一个基类,所有屏幕都从-
GameScreen
继承。该基类定义了各种方法,如
Render
HandleInput
ScreenManager
将在几个屏幕上调用
Render
(如果完全转换,可能会调用顶部的一个,如果中间转换,则调用顶部的2个),并仅在顶部屏幕上手动输入

BaseScreen
可以有一个处理所有屏幕共有的输入的简单实现,例如,当用户按下控制器上的
B
或键盘上的
Esc
时,它可能会退出屏幕。此时,您可能希望在GS中引发一个称为
BackPressed
的事件M sample他们没有这个事件,他们只有一个
OnCancel
virtual方法,它在
MenuScreen
抽象类中,而不是基类中。这将取决于派生屏幕类如何处理它,或者默认退出当前屏幕,或者执行其他操作(比如暂停游戏)


MenuScreen
是更复杂的基本屏幕的一个相当好的例子,允许用户选择项目(这可能引发
ItemSelected
事件,或调用
OnItemSelected
虚拟方法)。他们使用一个名为
MenuItem
的小类来管理单个菜单项。屏幕管理处理输入(在
HandleInput
事件中)捕捉DPad/按箭头键等,以处理选择不同项目的操作。

如果您只想了解为什么不需要它,因为大多数理论都是一样的。我很高兴您找到了一个适合您的教程,但对书籍/教程/讲座的请求与堆栈溢出Q&a格式的.Af不匹配通过阅读你的答案并结合我在网上找到的教程,我能够创建一个菜单系统,使用鼠标点击、鼠标进入、鼠标悬停、鼠标退出和键盘输入。我现在记不起教程的URL,但我会在回家后发布。谢谢你的帮助,我真的很感激