c#GDI+游戏编程:《疯狂的炸弹之幽灵之战v1.0》素材准备 .

本文介绍了一种游戏资源加载的方法,通过使用不同的初始化模式,能够有效减少内存占用并提高游戏性能。文章提供了具体代码示例,展示了如何根据不同类型的素材进行加载。

/*__________________________________________________________________

 

      游戏采用的素材主要有这几种形式的,4*4 、1*N、1*1等,如果你不想处理那些复杂的素材,全部用1*1的素材即可,只是画面会比较单调点而已,个人喜好了。

      有了素材,就必须引用到我们的游戏中去,我们可以把它们添加到Resources.resx资源文件中去,这样在发布应用程序的时候就不用连素材文件也发布了;也可以独立把素材文件放到其他地方,根据文件路径名加载就可以了。

      所以我写了一个InitResources类,专门负责初始化这些素材,直接看代码吧!

[c-sharp] view plain copy print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Drawing;  
  5.   
  6. namespace hweny.CrazyBomb.BaseData  
  7. {  
  8.     //初始化模式   
  9.     public enum InitMode  
  10.     {  
  11.         FromFilePath,//从文件路径   
  12.         FromResource //从资源文件   
  13.     }  
  14.   
  15.     /// <summary>   
  16.     /// 初始化游戏资源   
  17.     /// </summary>   
  18.     public class InitResources  
  19.     {  
  20.         //资源实例   
  21.         private static InitResources instance;  
  22.   
  23.         public InitResources()  
  24.         {  
  25.             if (Utility.ResourceSizeWidth % Utility.ResourceSizeHeight != 0  
  26.              && Utility.BitmapWidth % Utility.BitmapHeight != 0)  
  27.                 return;  
  28.         }  
  29.   
  30.         public static InitResources Instance  
  31.         {  
  32.             get  
  33.             {  
  34.                 if (instance == null)  
  35.                 {  
  36.                     instance = new InitResources();  
  37.                 }  
  38.                 return instance;  
  39.             }  
  40.         }  
  41.   
  42.         /// <summary>   
  43.         /// 初始化游戏4*4素材   
  44.         /// </summary>   
  45.         /// <param name="value">资源值或路径</param>   
  46.         /// <param name="mode">初始化模式</param>   
  47.         /// <returns>游戏素材4个方向走动图</returns>   
  48.         public Bitmap[][] InitActivityObjects(string value, InitMode mode)  
  49.         {  
  50.             Bitmap[][] bmps = new Bitmap[Utility.RoleDirections][]  
  51.             {  
  52.                 new Bitmap[Utility.RoleSteps],  
  53.                 new Bitmap[Utility.RoleSteps],  
  54.                 new Bitmap[Utility.RoleSteps],  
  55.                 new Bitmap[Utility.RoleSteps]  
  56.             };  
  57.   
  58.             Bitmap bmp = new Bitmap(Utility.BitmapWidth, Utility.BitmapHeight);  
  59.             switch (mode)  
  60.             {  
  61.                 case InitMode.FromResource: //访问资源文件初始化游戏素材   
  62.                     bmp = (Bitmap)Properties.Resources.ResourceManager.GetObject(value);  
  63.                     break;  
  64.                 case InitMode.FromFilePath: //从指定文件路径初始化游戏素材   
  65.                     bmp = (Bitmap)Image.FromFile(value);  
  66.                     break;  
  67.                 default:  
  68.                     break;  
  69.             }  
  70.   
  71.             for (int y = 0, i = 0; y < Utility.ResourceSizeHeight; y += Utility.BitmapHeight, i++)  
  72.             {  
  73.                 for (int x = 0, j = 0; x < Utility.ResourceSizeWidth; x += Utility.BitmapWidth, j++)  
  74.                 {  
  75.                     bmps[i][j] = bmp.Clone(new Rectangle(x, y, Utility.BitmapWidth, Utility.BitmapHeight), System.Drawing.Imaging.PixelFormat.DontCare);  
  76.                 }  
  77.             }  
  78.             return bmps;  
  79.         }  
  80.   
  81.         /// <summary>   
  82.         /// 初始化游戏1*N素材   
  83.         /// </summary>   
  84.         /// <param name="value">资源值或路径</param>   
  85.         /// <param name="frames">帧数</param>   
  86.         /// <param name="size">尺寸</param>   
  87.         /// <param name="mode">初始化模式</param>   
  88.         /// <returns></returns>   
  89.         public Bitmap[] InitStaticObjects(string value, int frames, Size size, InitMode mode)  
  90.         {  
  91.             Bitmap[] bmps = new Bitmap[frames];  
  92.             Bitmap bmp = new Bitmap(size.Width, size.Height);  
  93.             switch (mode)  
  94.             {  
  95.                 case InitMode.FromResource: //访问资源文件初始化游戏素材   
  96.                     bmp = (Bitmap)Properties.Resources.ResourceManager.GetObject(value);  
  97.                     break;  
  98.                 case InitMode.FromFilePath: //从指定文件路径初始化游戏素材   
  99.                     bmp = (Bitmap)Image.FromFile(value);  
  100.                     break;  
  101.                 default:  
  102.                     break;  
  103.             }  
  104.   
  105.             for (int i = 0, j = 0; i < size.Width; i += size.Width / frames, j++)  
  106.             {  
  107.                 bmps[j] = bmp.Clone(new Rectangle(i, 0, size.Width / frames, size.Height), System.Drawing.Imaging.PixelFormat.DontCare);  
  108.             }  
  109.             return bmps;  
  110.         }  
  111.   
  112.         /// <summary>   
  113.         /// 初始化1*1素材   
  114.         /// </summary>   
  115.         /// <returns></returns>   
  116.         public Bitmap InitSingleFrameObject(string value, int x, int y, Size size, InitMode mode)  
  117.         {  
  118.             Bitmap bmp = new Bitmap(size.Width, size.Height);  
  119.             switch (mode)  
  120.             {  
  121.                 case InitMode.FromResource: //访问资源文件初始化游戏素材   
  122.                     bmp = (Bitmap)Properties.Resources.ResourceManager.GetObject(value);  
  123.                     break;  
  124.                 case InitMode.FromFilePath: //从指定文件路径初始化游戏素材   
  125.                     bmp = (Bitmap)Image.FromFile(value);  
  126.                     break;  
  127.                 default:  
  128.                     break;  
  129.             }  
  130.             bmp = bmp.Clone(new Rectangle(x, y, size.Width, size.Height), System.Drawing.Imaging.PixelFormat.DontCare);  
  131.             return bmp;  
  132.         }  
  133.     }  
  134. }  

 

      这里定义了不同维数的位图数组保存不同规格的游戏素材,有的人问为什么不直接在绘制图象的时候从资源文件那里读取再Clone()某个部分的副本,这样就不需要这么麻烦先读取后存到数组再使用了。但在测试过程中会发现,从资源文件创建副本相当于new  Bitmap();频繁的new将会占用非常多的内存,你会发现只绘制不算多的图象cpu就猛彪了!

      先把素材保存在数组中,以后根据索引直接可以取到指定图象了,这样避免了频繁的new,你会发现性能有很大提高。

      上面涉及到Utility...的变量,是另外一个类中的静态变量,主要定义了游戏通用的一些数据,在这里就不贴了,看变量名应该清楚是什么意思,或者去下载我的源代码去详细了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值