5.使用UIManager管理2D控件

如果你研究过《ProfessionalXNA》一书,发现前一个教程中的三个控件类实际上就相当于SpriteToRender类,体现了面向对象编程的思想,这个方法在《Learning XNA 3.0》的第4章“应用面向对象设计(http://www.cnblogs.com/eros/archive/2009/04/28/1445638.html)”中也有介绍(林公子翻译到了第六章,不过很久没有更新了,大概是放弃了,是不是知道了台湾已经出了繁体中文版的缘故),即每个类包含各自的属性和绘制方法,而本教程要编写的UIManager类就相当于SpriteHelper类(其实叫做SpriteManager类更合适),SpriteHelper类管理SpriteToRender类的集合,主要功能就是遍历集合中的所有SpriteToRender对象,调用它们的绘制方法,同理UIManager类管理从UISceneNode类继承的三种控件的集合,主要功能就是遍历集合中的所有UISceneNode对象,调用它们的绘制方法。

事实上这已经是第三次使用这个思路了,第一次是ScenManager类管理Scene的集合,第二次是Scene类管理非UISceneNode的SceneNode的集合。下面是UIManager的代码:

namespace StunEngine.SceneManagement
{
    /// <summary>
    /// 处理用户与UI的交互
    /// </summary>
    public sealed class UIManager
    {
        成员变量和构造函数

        属性

        更新、绘制方法

        公有方法

    }
}

与前面的管理类一样,都要实现添加和移除所管理的类对象的功能,UIManager类中对应的方法是AddElement和RemoveElement方法。这个类还需要两个集合分别存储绘制顺序的zorder和可以获得焦点的控件的索引tabindex,这两个集合是由IndexList类定义的,IndexList类的代码不写了,自己去看源代码吧。

按Tab键在可获得焦点的控件间切换是在Update方法中实现的,而在Update方法中实际调用的是ChangeFocus方法,接下来处理鼠标事件,自己看注释吧。

在Draw方法中绘制所有UISceneNode集合,而且是根据zorder顺序绘制的,也就是说场景中最先添加的对象最后才被绘制(其实这里有点别扭,习惯上是先添加的先绘制,比方说先添加背景,然后在添加的图像会覆盖在背景上)。

在鼠标点击或移入时还会发出对应的声音,这是由Sound类进行处理的,这个类参考了《ProfessionalXNA》中的§9.3Sound类,其中的Xact项目来自于《ProfessionalXNA》中的XNAShooter游戏,我把除鼠标点击和鼠标移入的其他声音都删除了,Sound的实际代码不长:

namespace StunEngine.Sounds
{
    /// <summary>
    /// Sound类
    /// </summary>
    class Sound
    {
        变量

        声音枚举

        构造函数

        播放声音        

        更新
        
    }
}

注意:在XGS3.1版本中需要使用Microsoft Cross-Platform Audio Creation Tool 3 (XACT3)建立Xact项目,而XGS3.0之前的Xact项目是由Microsoft Cross-Platform Audio Creation Tool 2创建的,你需要使用Microsoft Cross-Platform Audio Creation Tool 3打开Xact项目再保存一次,否则程序会报版本不一致的错误。

别忘了在引擎类的Update()方法中调用Sound.Update()方法。


发布时间:2009/11/27 下午2:31:17  阅读次数:6526

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号