疯狂ios讲义疯狂连载之游戏的状态数据模型

简介:

对游戏玩家而言在游戏界面上看到的“元素”千差万别、变化多端但对游戏开发者而言游戏界面上的元素在底层都是一些数据不同的数据所绘制的图片有所不同。因此建立游戏的状态数据模型是实现游戏逻辑的重要步骤。


13.3.1 定义数据模型


《疯狂连连看》的游戏界面是一个n×m的“网格”每个网格上显示一张图片对游戏开发者来说这个网格只需要用一个二维数据来定义而每个网格上所显示的图片对底层的数据模型来说不同的图片对应于不同的数值即可。图13.6显示了数据模型的示意。


092233_BBQ5_262659.jpg


13.6《疯狂连连看》的数据模型

对于图13.6所示的数据模型只要让数值为0的网格上不绘制图片其他数值的网格则绘制相应的图片就可显示出《疯狂连连看》的游戏界面。


本程序实际上并不是直接使用int[][]数组来保存游戏的状态数据而是采用NSArray来保存游戏的状态模型而NSArray的元素又是NSArray相当于创建二维数组数组元素是FKPiece。因为FKPiece对象封装的信息更多不仅包含了该方块左上角的XY坐标还包含了该FKPiece所显示的图片、图片ID这个图片ID可作为该FKPiece的数据。


13.3.2 初始化游戏状态数据


为了初始化游戏状态程序需要创建一个NSArray数组为此程序定义一个FKBaseBoard基类该基类的代码如下。


程序清单codes/13/Link/Link/sources/board/FKBaseBoard.h

wKiom1L8I7mDfMGVAAB0wo944LI255.jpg

程序清单codes/13/Link/Link/sources/board/FKBaseBoard.m


wKioL1L8I66S3h_YAAU-9S6Y2aQ817.jpg

上面的粗体字代码块用于初始化NSArray代表的二维数组为有方块的FKPiece元素的beginXbeginYimage属性赋值beginXbeginY根据该方块在二维数组中的位置动态计算得到。


提示

上面程序中用到了 xSize ySize 等常量这两个常量用于代表该游戏在横向和纵向上各包含多少个方块。程序专门定义了一个 Constants.h 文件来记录这些常量的值后面有些类也用到了该头文件中的常量请读者参考本书配套光盘中的 Constants.h 文件。

程序中的①号代码调用了createPieces:方法来创建一个NSArray集合该方法将会交给其子类去实现这里是典型的“模板模式”的应用。FKBaseBoard基类完全可以根据FKPiece对象在二维数组中的位置动态地计算它的beginXbeginYFKBaseBoard不确定NSArray代表二维数组的哪些元素是有方块的。

由于《疯狂连连看》游戏的初始状态可能有很多种比如横向分布的方块、竖向分布的方块、矩阵排列的方块、随机分布的方块等该程序为了考虑以后的扩展性此处只采用了模板模式FKBaseBoard基类负责完成通用的代码对于暂时无法确定的需要子类实现的部分可定义成createPieces:方法。

提示  

由于Objective-C没有提供抽象类和抽象方法的概念因此此处将createPieces:方法定义成返回nil的空方法。


上面的程序中还用到了一个ImageUtil工具类它的作用是自动搜寻项目包的图片并根据需要随机读取该目录下的图片。后面会详细介绍该工具类的用法。


下面为该FKBaseBoard实现三个子类。

1矩阵排列的方块


矩阵排列的方块会填满二维数组的每个数组元素只是把四周留空即可该子类的代码实现如下接口部分几乎没有代码因此此处不再给出。

程序清单/Users/yeeku/publish/codes/13/Link/Link/sources/board/FKFullBoard.m

 

wKiom1L8JBnw2ZNwAAKNkjkLCcc079.jpg

该子类初始化的游戏界面如图13.7所示。

092508_qFH5_262659.jpg

13.7矩阵排列的方块

2竖向排列的方块

竖向排列的方块以垂直的空列分隔开该子类的代码实现如下接口部分几乎没有代码因此此处不再给出。

程序清单codes/13/Link/Link/sources/board/FKVerticalBoard.m

wKiom1L8JDqRorNqAAKPjZZ1-JY014.jpg

程序中的粗体字代码控制了只设置i % 2 == 0的列也就是只设置索引为偶数的列该子类初始化的游戏界面如图13.8所示。

092551_ZIgR_262659.jpg

13.8竖向排列的方块

3横向排列的方块

横向排列的方块以水平的空行分隔开该子类的代码如下。

程序清单codes/13/Link/Link/sources/board/FKHorizontalBoard.m

 

wKioL1L8JCigzoqhAAK1x1mbx1g900.jpg

程序中的粗体字代码控制了只设置j % 2 == 0的行也就是只设置索引为偶数的行该子类初始化的游戏界面如图13.9所示。

092640_fPE4_262659.jpg


13.9 横向排列的方块


——————本文节选自《疯狂ios讲义上》

092715_G9aH_262659.jpg

 

本文转自fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/1358627 ,如需转载请自行联系原作者

相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
157 4
|
7月前
|
JSON JavaScript 安全
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
71 1
|
7月前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
114 0
|
4月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
7月前
|
Java iOS开发
iOS的数据序列化(又称持久化)的两类使用方式
iOS的数据序列化(又称持久化)的两类使用方式
72 0
|
7月前
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
366 1
|
7月前
|
JSON JavaScript 安全
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据