设为首页 收藏本站
查看: 1046|回复: 0

《XNA高级编程:Xbox 360和Windows》3-7

[复制链接]

尚未签到

发表于 2015-5-12 10:57:49 | 显示全部楼层 |阅读模式
3.7其他辅助类
   
     Helpers命名空间中还包括其他一些辅助类,大多数都像RandomHelper类一样简单,没有必要把它们都讲一遍,所以请你们自己看一下本章没有讲到的那些辅助类,如果想进一步了解它们可以使用其中的单元测试进行一些测试。

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

SpriteHelper类

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


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


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


DSC0002.jpg
图3-12

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


///
/// Empty color, used to mark unused color values.
///
public static readonly Color Empty = new Color(0, 0, 0, 0);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-66192-1-1.html 上篇帖子: Windows Phone 7 ListBox控件滚动分页加载数据 下篇帖子: Windows Phone 7 开发常见问题汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表