zoukankan      html  css  js  c++  java
  • 辅助类——其他辅助类

    其他辅助类

    Helpers命名空间中包括了更多的辅助类;大多数辅助类就像RandomHelper类一样简单。把它们遍历一遍非常沉闷,所以请你们自己审阅本章没有提及的那些辅助类,如果想进一步了解它们可以使用其中内含的单元测试进行检测。

    在本章结尾进入Breakout游戏之前,浏览几个余下的辅助类,它们在下面几章中会被频繁地使用:SpriteHelper、EnumHelper和ColorHelper。

    SpriteHelper类

    在上一章,你使用了多次sprite渲染,因为单元测试你被迫用一种简单的方式来处理XNA中的sprite。这种解决方案,以及事实上你可能把要用到的代码不止一次地放进可复用的类中,这导致我们使用SpriteHelper类(如图3-10所示)。它主要提供了一个构造器来创建新的SpriteHelper实例,存储texture纹理和Graphic Rectangle图像矩形数据,还提供了一些渲染方法更方便地把sprite绘制到屏幕上,就像你在上一章中使用一系列SpriteToRender类所做的那样。

    1
    图 3-10

    这里的大多数方法都没有做很多操作;构造器只是初始化数值,Render方法只是向sprite列表添加一个新的SpriteToRender实例,RenderCentered方法在指定位置居中显示sprite,最后DrawSprites方法把所有sprite绘制到屏幕上。看一看DrawSprites方法,它和前一章中的DrawSprites方法很类似,不过有一些改进:

    public static void DrawSprites(int width, int height)
    {
      // No need to render if we got no sprites this frame
      if (sprites.Count == 0)
        return;
    
      // Create sprite batch if we have not done it yet.
      // Use device from texture to create the sprite batch.
      if (spriteBatch == null)
        spriteBatch = new SpriteBatch(sprites[0].texture.GraphicsDevice);
    
      // Start rendering sprites
      spriteBatch.Begin(SpriteBlendMode.AlphaBlend,
        SpriteSortMode.BackToFront, SaveStateMode.None);
    
      // Render all sprites
      foreach (SpriteToRender sprite in sprites)
        spriteBatch.Draw(sprite.texture,
          // Rescale to fit resolution
          new Rectangle(
          sprite.rect.X * width / 1024,
          sprite.rect.Y * height / 768,
          sprite.rect.Width * width / 1024,
          sprite.rect.Height * height / 768),
          sprite.sourceRect, sprite.color);
          // We are done, draw everything on screen.
          spriteBatch.End();
    
    
          // Kill list of remembered sprites
          sprites.Clear();
        } // DrawSprites(width, height)

    以渲染窗口分辨率的当前宽度和高度为参数调用该方法,并根据分辨率对所有sprite进行比例缩放,这对于支持Xbox 360的所有分辨率非常重要。在DrawSprites 方法中首先检查是否有东西要渲染。然后确保静态的SpriteBatch对象被创建,它将被所有需要绘制的sprite使用到。调用SpriteBatch的Begin方法之后,在当前帧中遍历所有的sprite并重新调整它们的尺寸以适应当前屏幕,最后通过调用End方法让每一个sprite绘制到屏幕上。sprite列表也被清空,开始刷新下一帧。作为该类如何工作的范例,可以参看本章最后的Breakout游戏。

    EnumHelper类

    当你需要遍历枚举项,或者快速获取枚举值序号的时候,EnumHelper类(如图3-11所示)非常有用。在Pong和Breakout游戏中没有用到任何枚举类型,但下一章的游戏在遍历block类型的时候使用Enum类(System.Enum)变得非常有用。也请注意到,EnumHelper类用到了Enum类的几个方法,这些方法在.Net Compact Framework中并没有被实现。为了避免任何编译错误,在Xbox 360项目中通常排除整个EnumHelper类,不过如果你喜欢,在Windows平台上还是可以使用它。

    2
    图 3-11

    单元测试用的TestGetAllEnumNames方法如下所示,也说明了GetAllEnumNames方法是如何工作的。它借助EnumHelper类内部定义的EnumEnumerator辅助类来遍历每一个枚举值。

    [Test]
    public void TestGetAllEnumNames()
    {
      Assert.AreEqual(
        "Missions, Highscore, Credits, Help, Options, Exit, Back",
        EnumHelper.GetAllEnumNames(typeof(MenuButton)));
    } // TestGetAllEnumNames()

    GetAllEnumNames方法则使用了之前讨论的StringHelper类中的WriteArrayData辅助方法:

    public static string GetAllEnumNames(Type type)
    {
      return StringHelper.WriteArrayData(GetEnumerator(type));
    } // GetAllEnumNames(type)
    ColorHelper类

    ColorHelper类(如图3-12所示)原本长得多,并且具有许多的方法,但是因为XNA中新的Color类比Managed DirectX中使用的System.Drawings中的Color类强大得多,所以有很多方法就不再需要了。不过它还是包含了一些对颜色操作有用的方法。

    3
    图 3-12

    例如,ColorHelper.Empty字段可以用来把shader特效参数设置为空值——0,0,0,0通常不是一个合法颜色值;它是完全透明的。而黑色的Alpha值是255。

    /// <summary>
    /// Empty color, used to mark unused color values.
    /// </summary>
    public static readonly Color Empty = new Color(0, 0, 0, 0);
  • 相关阅读:
    多线程
    ERP概念介绍
    Servlet生命周期
    springmvc工作流程
    spring事务管理的接口
    解决主从备份Slave_SQL_Running:No
    实现Mysql主从备份
    springboot集成mybatis进行开发
    SpringBoot 入门第一章
    Hibernate 关联关系映射
  • 原文地址:https://www.cnblogs.com/AlexCheng/p/2120265.html
Copyright © 2011-2022 走看看