zoukankan      html  css  js  c++  java
  • [翻译]XNA外文博客文章精选之fifteen


    PS:自己翻译的,转载请著明出处

                                                              简单的图象模板
                                                                              Jesse Chounard
    前言
                                          这是一个非常简单的方法去创建一个模板从一个纹理中,你可以使用粒子效果。我使用这个效果在我的xbox在线游戏社区的主要屏幕中。一个类似的效果可以看到在Braid的开始,这里游戏的标题被显示。


    Getting Started-Brute Force

                                          让我们开始这个brute forch方法。我们想要从我们图象的某处象素没有完全透明(意思是alpha值不是0)的随机的X和Y值。
                   步骤:                                  
                       1.从图象中得到象素数据。
                       2.产生随机的X和Y值
                       3.测试alpha值在这个位置上,如果是0,返回到步骤2并且在试一次。

     1 Vector2 BruteForceRandomPosition(Texture2D texture)
     2 {
     3     Color[] colorData = new Color[texture.Width * texture.Height];
     4     texture.GetData<Color>(colorData);
     5     do
     6     {
     7         int x = random.Next(texture.Width);
     8         int y = random.Next(texture.Height);
     9         if (colorData[y * texture.Width + x].A != 0)
    10         {
    11             return new Vector2(x, y);
    12         }
    13     } while (true);
    14 }

    Optimization(最优化)
                                          虽然它工作了,但是这里有些严重的问题。
                        1.每一次我们从图象中读出颜色数据,我们需要一个随机的位置。不仅是缓慢的,而且我们不断的分配并且释放我们不需要的内存块。
                        2.由于我们的图象大部分是透明的部分,,我们可以用相当长的时间循环直到我们找一个有效的象素。
                                           幸运的是,这是一个非常简单的事情,用一个预处理步骤处理。事实上,我建议你使用这个Content Pipeline去实现这个,并且移动所有正在绘制的粒子到GPU中,但是这是超出了本文的范围位。
                     步骤:
                         1.从图象中得到象素数据。
                         2.通过查看整个图像,逐个逐个象素的看。如果alpha是非零的,添加位置到象素位子列表中。
                         3.产生一个随机数在0到表单的长度之间。使用它作为表单的偏移量,并且我们有一个有效的象素位置。
     1 List<Vector2> GenerateTemplate(Texture2D texture)
     2 {
     3     List<Vector2> templateData = new List<Vector2>();
     4     Color[] colorData = new Color[texture.Width * texture.Height];
     5     texture.GetData<Color>(colorData);
     6     for (int y = 0; y < texture.Height; y++)
     7     {
     8         for (int x = 0; x < texture.Width; x++)
     9         {
    10             if (colorData[y * texture.Width + x].A != 0)
    11             {
    12                 templateData.Add(new Vector2(x, y));
    13             }
    14         }
    15     }
    16     return templateData;
    17 }
    18 Vector2 RandomFromTemplate(List<Vector2> templateData)
    19 {
    20     return templateData[random.Next(templateData.Count)];
    21 }

    Conclusion(结论)
                                          在示例代码中,我们包含一个非常简单的粒子系统,所以你可以看见在活动。粒子超出了这篇文章的范围,并且这里有很多的文章关于高性能的粒子系统,所以我提醒你去查找他们。


    源代码:http://www.ziggyware.com/readarticle.php?article_id=218
    (完)
  • 相关阅读:
    关于Ubuntu 9.10 的aptget update 一直无法更新源的点点滴滴
    CentOS的安装和搭建文件共享服务器(Samba)
    VirtualBox 下的 Ubuntu 虚拟机中使用 Android 真机做开发调试
    VmWare下安装CentOS6图文安装教程
    CentOS的远程桌面(xdm)
    ubuntu Apache安装设置
    关于母版页的按钮事件
    TSQL使用函数uppercase更新xml
    文章的上一篇和下一篇导航 V2
    数据库用户映射到 SQL Server 登录名
  • 原文地址:https://www.cnblogs.com/315358525/p/1564206.html
Copyright © 2011-2022 走看看