/*__________________________________________________________________
游戏采用的素材主要有这几种形式的,4*4 、1*N、1*1等,如果你不想处理那些复杂的素材,全部用1*1的素材即可,只是画面会比较单调点而已,个人喜好了。
有了素材,就必须引用到我们的游戏中去,我们可以把它们添加到Resources.resx资源文件中去,这样在发布应用程序的时候就不用连素材文件也发布了;也可以独立把素材文件放到其他地方,根据文件路径名加载就可以了。
所以我写了一个InitResources类,专门负责初始化这些素材,直接看代码吧!
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Drawing;
- namespace hweny.CrazyBomb.BaseData
- {
- //初始化模式
- public enum InitMode
- {
- FromFilePath,//从文件路径
- FromResource //从资源文件
- }
- /// <summary>
- /// 初始化游戏资源
- /// </summary>
- public class InitResources
- {
- //资源实例
- private static InitResources instance;
- public InitResources()
- {
- if (Utility.ResourceSizeWidth % Utility.ResourceSizeHeight != 0
- && Utility.BitmapWidth % Utility.BitmapHeight != 0)
- return;
- }
- public static InitResources Instance
- {
- get
- {
- if (instance == null)
- {
- instance = new InitResources();
- }
- return instance;
- }
- }
- /// <summary>
- /// 初始化游戏4*4素材
- /// </summary>
- /// <param name="value">资源值或路径</param>
- /// <param name="mode">初始化模式</param>
- /// <returns>游戏素材4个方向走动图</returns>
- public Bitmap[][] InitActivityObjects(string value, InitMode mode)
- {
- Bitmap[][] bmps = new Bitmap[Utility.RoleDirections][]
- {
- new Bitmap[Utility.RoleSteps],
- new Bitmap[Utility.RoleSteps],
- new Bitmap[Utility.RoleSteps],
- new Bitmap[Utility.RoleSteps]
- };
- Bitmap bmp = new Bitmap(Utility.BitmapWidth, Utility.BitmapHeight);
- switch (mode)
- {
- case InitMode.FromResource: //访问资源文件初始化游戏素材
- bmp = (Bitmap)Properties.Resources.ResourceManager.GetObject(value);
- break;
- case InitMode.FromFilePath: //从指定文件路径初始化游戏素材
- bmp = (Bitmap)Image.FromFile(value);
- break;
- default:
- break;
- }
- for (int y = 0, i = 0; y < Utility.ResourceSizeHeight; y += Utility.BitmapHeight, i++)
- {
- for (int x = 0, j = 0; x < Utility.ResourceSizeWidth; x += Utility.BitmapWidth, j++)
- {
- bmps[i][j] = bmp.Clone(new Rectangle(x, y, Utility.BitmapWidth, Utility.BitmapHeight), System.Drawing.Imaging.PixelFormat.DontCare);
- }
- }
- return bmps;
- }
- /// <summary>
- /// 初始化游戏1*N素材
- /// </summary>
- /// <param name="value">资源值或路径</param>
- /// <param name="frames">帧数</param>
- /// <param name="size">尺寸</param>
- /// <param name="mode">初始化模式</param>
- /// <returns></returns>
- public Bitmap[] InitStaticObjects(string value, int frames, Size size, InitMode mode)
- {
- Bitmap[] bmps = new Bitmap[frames];
- Bitmap bmp = new Bitmap(size.Width, size.Height);
- switch (mode)
- {
- case InitMode.FromResource: //访问资源文件初始化游戏素材
- bmp = (Bitmap)Properties.Resources.ResourceManager.GetObject(value);
- break;
- case InitMode.FromFilePath: //从指定文件路径初始化游戏素材
- bmp = (Bitmap)Image.FromFile(value);
- break;
- default:
- break;
- }
- for (int i = 0, j = 0; i < size.Width; i += size.Width / frames, j++)
- {
- bmps[j] = bmp.Clone(new Rectangle(i, 0, size.Width / frames, size.Height), System.Drawing.Imaging.PixelFormat.DontCare);
- }
- return bmps;
- }
- /// <summary>
- /// 初始化1*1素材
- /// </summary>
- /// <returns></returns>
- public Bitmap InitSingleFrameObject(string value, int x, int y, Size size, InitMode mode)
- {
- Bitmap bmp = new Bitmap(size.Width, size.Height);
- switch (mode)
- {
- case InitMode.FromResource: //访问资源文件初始化游戏素材
- bmp = (Bitmap)Properties.Resources.ResourceManager.GetObject(value);
- break;
- case InitMode.FromFilePath: //从指定文件路径初始化游戏素材
- bmp = (Bitmap)Image.FromFile(value);
- break;
- default:
- break;
- }
- bmp = bmp.Clone(new Rectangle(x, y, size.Width, size.Height), System.Drawing.Imaging.PixelFormat.DontCare);
- return bmp;
- }
- }
- }
这里定义了不同维数的位图数组保存不同规格的游戏素材,有的人问为什么不直接在绘制图象的时候从资源文件那里读取再Clone()某个部分的副本,这样就不需要这么麻烦先读取后存到数组再使用了。但在测试过程中会发现,从资源文件创建副本相当于new Bitmap();频繁的new将会占用非常多的内存,你会发现只绘制不算多的图象cpu就猛彪了!
先把素材保存在数组中,以后根据索引直接可以取到指定图象了,这样避免了频繁的new,你会发现性能有很大提高。
上面涉及到Utility...的变量,是另外一个类中的静态变量,主要定义了游戏通用的一些数据,在这里就不贴了,看变量名应该清楚是什么意思,或者去下载我的源代码去详细了解。