在制作推箱子,五子棋,消消乐等游戏时,我们一般会用到格子类的思想。因为这类游戏的地图都很类似网格,非常有规律。
格子类的原理有以下几点很重要:
1、所有游戏物体的坐标一定是正整数且类似网格有规律的排列。我们可以通过游戏物体的坐标(x,y),去对应二维数组的索引器[a,b],也就是说我们我们可以通过游戏物体的坐标找到二维数组中对应的对象,也可以通过二维数组中的对象找到对应的游戏物体在世界坐标轴中的位置。
2、使用格子类做游戏,一定要明白我们其实搭建了两层地图,一层给玩家看,一层给电脑看。游戏画面这一层是给玩家看的,二维数组这一层才是给电脑看的,程序员和玩家都是看不见的。然后通过第一点将这两层地图关联起来。
3、二维数组中每个对象身上一般都会有一个变量,我们就是通过每个对象身上变量的值不同,来进行我们需要的一系列判断,来维持游戏的运行、操作等。
格子类的搭建如下图所示:(下图代码只是单纯的搭建格子类,没有和游戏物体相结合。和游戏物体相结合只需要改动一下即可,毕竟原理一致。)
1 public enum GridType//格子类型枚举 2 { 3 gridType1, 4 gridType2 5 } 6 11 public class Grid//单个格子类 12 { 13 private GridType _gridType; 14 public GridType gridType 15 { 16 get { return _gridType; } 17 set { _gridType = value; } 18 } 19 } 20 21 public class Grids//总的格子类 22 { 23 public static Grid[,] grids = new Grid[10, 10];//建立一个 Grid 类型的二维数组,用来存放 Grid 类型的对象。 24 25 public static void CreateMap()//通过 for 循环,将 grids 二维数组中的每个元素都赋值,完成格子类的初始化。 26 { 27 for (int i = 0; i < grids.GetLength(0); i++) 28 { 29 for (int j = 0; j < grids.GetLength(1); j++) 30 { 31 grids[i, j] = new Grid(); 32 } 33 } 34 } 35 36 //通过坐标找到 grids 数组中对应的 Grid 对象。 37 public static Grid GetGrid(Vector3 pos) 38 { 39 return grids[(int)pos.x, (int)pos.y]; 40 } 41 42 //通过坐标对 Grid 对象的 gridType 变量进行赋值。 43 public static void SetGrid(Vector3 pos, GridType type) 44 { 45 GetGrid(pos).gridType = type; 46 } 47 }
在进行坐标和索引之间的转换时,我们需要注意一点:由于程序在运行时,会出现误差,有时候的计算不会刚刚好,所以我们需要想清楚是用int进行数据的转换,还是用四舍五入的方法进行数据转换。例如我想要的是2,但是电脑由于误差,计算为1.999,用int转,这个值就会变成1,但是用四舍五入转就会是2,这点差别需要搞清楚。