• 《XNA高级编程:Xbox 360和Windows》37


    3.7其他辅助类

      
         Helpers命名空间中还包括其他一些辅助类,大多数都像RandomHelper类一样简单,没有必要把它们都讲一遍,所以请你们自己看一下本章没有讲到的那些辅助类,如果想进一步了解它们可以使用其中的单元测试进行一些测试。

         在介绍Breakout游戏之前,先简要地看看这样几个辅助类,它们在下面几章中会被反复地使用:SpriteHelperEnumHelperColorHelper

    SpriteHelper


         上一章已经讲了很多渲染sprite的内容,当时为了配合单元测试而不得不使用一种简单的方式来处理sprite。很多时候需要把反复使用的有用代码放进可复用的类中,于是就产生了这样一个SpriteHelper类(如图3-10所示)。它提供了一个构造函数创建SpriteHelper实例,存储textureGraphic Rectangle数据,还提供了一些渲染方法更方便地把sprite渲染输出到屏幕上,就像上一章中使用SpriteToRender类一样。

    图3-10

    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 with help of the end method.
        spriteBatch.End();
        
    // Kill list of remembered sprites
        sprites.Clear();
    // DrawSprites()

         在调用该方法的时候,传递当前窗口分辨率的宽度和高度,并根据当前分辨率对所有sprite进行比例缩放,这对于支持Xbox 360的多分辨率非常重要。方法首先检查是否有东西要渲染,然后确保SpriteBatch类的静态实例(就是这里的spriteBatch变量)是否已被创建,调用Begin方法之后,在当前帧中遍历所有的sprite并重新调整它们的尺寸以适应当前屏幕的大小,最后当把所有sprite画到屏幕上之后再调用End方法。另外还要把sprite列表清空,为下一帧的渲染做准备。可以研究本章最后的Breakout游戏来看看这个类是如何工作的。

    EnumHelper

        
         EnumHelper类(如图3-11所示)对于遍历枚举项以及获取枚举值的个数等操作非常有用。在PongBreakout游戏中没有用到任何枚举类型,但下一章的游戏在遍历block类型的时候使用Enum类(System.Enum)有很大帮助。注意,EnumHelper类用到了Enum类的几个方法,这些方法在.Net Compact Framework中并没有被实现。为了避免编译错误,在Xbox 360项目中通常排除整个EnumHelper类,不过在Windows平台上可以使用它。

    图3-11

    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类比托管DirectX中使用的System.Drawings中的Color类的功能更加强大,所以有很多方法就不再需要了,不过它还是包含了一些对颜色操作非常有用的方法。

    图3-12

    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(0000);
  • 相关阅读:
    关于在调用JAVAFX相关包时遇到Access restriction: The type 'Application' is not API (restriction on required library)的解决方法
    JS 获取随机颜色值
    JS jQuery 点击页面漂浮出文字
    JQ 获取浏览器窗口宽高
    JQ 操作css
    JQ 遍历--(祖先,后代,同胞,过滤)
    JQ DOM元素 创建 添加 删除
    jQuery 效果
    3
    webpack 打包CSS 引入图片
  • 原文地址:https://www.cnblogs.com/AlexCheng/p/2120329.html
Copyright © 2020-2023  润新知