• [翻译]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
    (完)
  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/315358525/p/1564206.html
Copyright © 2020-2023  润新知