对游戏玩家而言在游戏界面上看到的“元素”千差万别、变化多端但对游戏开发者而言游戏界面上的元素在底层都是一些数据不同的数据所绘制的图片有所不同。因此建立游戏的状态数据模型是实现游戏逻辑的重要步骤。
13.3.1 定义数据模型
《疯狂连连看》的游戏界面是一个n×m的“网格”每个网格上显示一张图片对游戏开发者来说这个网格只需要用一个二维数据来定义而每个网格上所显示的图片对底层的数据模型来说不同的图片对应于不同的数值即可。图13.6显示了数据模型的示意。
图13.6《疯狂连连看》的数据模型
对于图13.6所示的数据模型只要让数值为0的网格上不绘制图片其他数值的网格则绘制相应的图片就可显示出《疯狂连连看》的游戏界面。
本程序实际上并不是直接使用int[][]数组来保存游戏的状态数据而是采用NSArray来保存游戏的状态模型而NSArray的元素又是NSArray相当于创建二维数组数组元素是FKPiece。因为FKPiece对象封装的信息更多不仅包含了该方块左上角的X、Y坐标还包含了该FKPiece所显示的图片、图片ID这个图片ID可作为该FKPiece的数据。
13.3.2 初始化游戏状态数据
为了初始化游戏状态程序需要创建一个NSArray数组为此程序定义一个FKBaseBoard基类该基类的代码如下。
程序清单codes/13/Link/Link/sources/board/FKBaseBoard.h
程序清单codes/13/Link/Link/sources/board/FKBaseBoard.m
上面的粗体字代码块用于初始化NSArray代表的二维数组为有方块的FKPiece元素的beginX、beginY、p_w_picpath属性赋值beginX、beginY根据该方块在二维数组中的位置动态计算得到。
提示
上面程序中用到了xSize、ySize等常量这两个常量用于代表该游戏在横向和纵向上各包含多少个方块。程序专门定义了一个Constants.h文件来记录这些常量的值后面有些类也用到了该头文件中的常量请读者参考本书配套光盘中的Constants.h文件。程序中的①号代码调用了createPieces:方法来创建一个NSArray集合该方法将会交给其子类去实现这里是典型的“模板模式”的应用。FKBaseBoard基类完全可以根据FKPiece对象在二维数组中的位置动态地计算它的beginX、beginY但FKBaseBoard不确定NSArray代表二维数组的哪些元素是有方块的。
由于《疯狂连连看》游戏的初始状态可能有很多种比如横向分布的方块、竖向分布的方块、矩阵排列的方块、随机分布的方块等该程序为了考虑以后的扩展性此处只采用了模板模式FKBaseBoard基类负责完成通用的代码对于暂时无法确定的需要子类实现的部分可定义成createPieces:方法。
提示由于Objective-C没有提供抽象类和抽象方法的概念因此此处将createPieces:方法定义成返回nil的空方法。
上面的程序中还用到了一个ImageUtil工具类它的作用是自动搜寻项目包的图片并根据需要随机读取该目录下的图片。后面会详细介绍该工具类的用法。
下面为该FKBaseBoard实现三个子类。
矩阵排列的方块会填满二维数组的每个数组元素只是把四周留空即可该子类的代码实现如下接口部分几乎没有代码因此此处不再给出。
程序清单/Users/yeeku/publish/codes/13/Link/Link/sources/board/FKFullBoard.m
该子类初始化的游戏界面如图13.7所示。
图13.7矩阵排列的方块
竖向排列的方块以垂直的空列分隔开该子类的代码实现如下接口部分几乎没有代码因此此处不再给出。
程序清单codes/13/Link/Link/sources/board/FKVerticalBoard.m
程序中的粗体字代码控制了只设置i % 2 == 0的列也就是只设置索引为偶数的列该子类初始化的游戏界面如图13.8所示。
图13.8竖向排列的方块
横向排列的方块以水平的空行分隔开该子类的代码如下。
程序清单codes/13/Link/Link/sources/board/FKHorizontalBoard.m
程序中的粗体字代码控制了只设置j % 2 == 0的行也就是只设置索引为偶数的行该子类初始化的游戏界面如图13.9所示。
图13.9 横向排列的方块
——————本文节选自《疯狂ios讲义上》
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。