大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)


用plist列表文件来表示游戏数据

因为在这个炸弹人游戏中有很多不同的关卡,难度依次上升,所以对于每个关卡的数据我们必须存放在某个地方,有很多种保存方法,这里我们选择使用plist列表文件来保存每个关卡的数据.

选择Resources目录,在其中新建一个plist文件,命名为LevelsData.plist.

下面我们要想一想里面到底要存放神马数据.

大致有这些每一关卡砖块的数量,每关敌人的数量,每关剩余的时间限制和过关奖励的分数.

其中关卡敌人的数量需要在细化下,因为我们在游戏开始的一个目标就是建立多种敌人,所以这里要按每种敌人给出一个对应的数量.

按照上述所讨论的内容,最终建立的plist内容大致是如下这个样子:

游戏数据的内存表示

有了plist文件还不够,我们还需要将plist的内容读取到内存中去,这是以类实例的方式来读取的.

我们在Xcode中新建一个GameData类,继承于NSObject.

打开GameData.h头文件,设置如下:

  1. #import <Foundation/Foundation.h>
  2. //管理游戏数据的类
  3. @interface GameData : NSObject
  4. +(id)sharedInstance;
  5. @property (nonatomic,assign) NSInteger bombExplodeRange; //炸弹爆炸范围
  6. @property (nonatomic,assign) BOOL isManualExplode; //是否手动引爆
  7. @property (nonatomic,assign) BOOL isFearBomb; //玩家是否怕炸弹
  8. @property (nonatomic,assign) NSInteger bombCountLimit; //炸弹的数量限制
  9. @property (nonatomic,assign) NSInteger life; //玩家的命数
  10. @property (nonatomic,assign) BOOL isPlayerSpeedUp; //玩家是否处于加速状态
  11. @property (nonatomic,assign) BOOL canPlayerAcrossBrick; //玩家是否可以穿砖
  12. @property (nonatomic,assign) BOOL canPlayerAcorssBomb; //玩家是否可以穿炸弹
  13. @property (nonatomic,assign) NSInteger playerTotalScore; //玩家总得分
  14. @property (nonatomic,assign) NSInteger curLevelNumber; //当前关卡序号
  15. @property (nonatomic,assign) NSInteger curLevelBrickCount; //当前关卡砖块数量
  16. //@property (nonatomic,assign) NSInteger curLevelEnemyCount; //当前关卡敌人数量
  17. @property (nonatomic,assign) NSInteger curLevelFSCount; //当前关卡普通敌人的数量
  18. @property (nonatomic,assign) NSInteger curLevelFSGhostCount; //当前关卡FSGhost敌人的数量
  19. @property (nonatomic,assign) NSInteger curLevelFSDogCount; //当前关卡FSDog敌人的数量
  20. @property (nonatomic,assign) NSInteger curLevelFSCatTracerCount; //当前关卡FSCatTracer敌人的数量
  21. @property (nonatomic,assign) NSInteger curLevelGPCount; //当前关卡游戏道具数量
  22. @property (nonatomic,assign) NSInteger curLevelLeftTime; //当前关卡时间限制(秒)
  23. @property (nonatomic,assign) NSInteger curLevelPassScore; //当前关卡过关得分
  24. -(void)synchronize;
  25. -(void)saveGameData;
  26. -(void)loadGameData;
  27. -(void)initGameData;
  28. -(void)setGameDataWhenLevelLose;
  29. //注册默认游戏数据,如果App第一次运行则使用该数据.(因为你还未存入数据)
  30. -(void)regDefaultGameData;
  31. @end

里面定义了若干属性,分为两部分内容:和当前关卡相关的以及和游戏主角状态相关的内容,大家从属性的名称中大致可以区分出来,这里就不一一介绍了,注释都做的很详细.

GameData类中定义的方法并不多,一个类方法sharedInstance用来返回类的唯一实例,剩下的都是实例方法用来读取和保存游戏数据.

GameData类的实现

接下来我们来看一下GameData的实现代码,首先是类单例方法的实现:

  1. //返回GameDate类唯一单例
  2. +(instancetype)sharedInstance{
  3. static dispatch_once_t once;
  4. static GameData *sharedInstance;
  5. dispatch_once(&once,^{
  6. sharedInstance = [self new];
  7. });
  8. return sharedInstance;
  9. }

内容没啥好说的,然后是另一个简单的同步方法:

  1. //将NSUserDefaults数据写入磁盘
  2. -(void)synchronize{
  3. [[NSUserDefaults standardUserDefaults]synchronize];
  4. }

下面是读取数据的loadGameData方法:

  1. //从磁盘上将游戏数据读取出来
  2. -(void)loadGameData{
  3. NSDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:kPlayerData];
  4. self.bombExplodeRange = [dict[kBombExplodeRange] intValue];
  5. self.isManualExplode = [dict[kIsManualExplode] boolValue];
  6. self.isFearBomb = [dict[kIsFearBomb] boolValue];
  7. self.bombCountLimit = [dict[kBombCountLimit] intValue];
  8. self.life = [dict[kLife] intValue];
  9. self.isPlayerSpeedUp = [dict[kIsPlayerSpeedUp] boolValue];
  10. self.canPlayerAcrossBrick = [dict[kCanPlayerAcrossBrick] boolValue];
  11. self.canPlayerAcorssBomb = [dict[kCanPlayerAcrossBomb] boolValue];
  12. self.playerTotalScore = [dict[kPlayerTotalScore] intValue];
  13. self.curLevelNumber = [dict[kCurLevelNumber] intValue];
  14. //取得关卡数据文件的全路径
  15. NSString *plistFullPath = [[NSBundle mainBundle] pathForResource:s_LevelsDataFile
  16. ofType:@"plist"];
  17. //读取关卡数据到数组中
  18. NSArray *levelsDataAry = [NSArray arrayWithContentsOfFile:plistFullPath];
  19. NSAssert(self.curLevelNumber > 0 && self.curLevelNumber <= levelsDataAry.count,
  20. @"Error curLevel Number!");
  21. //关卡是从1开头,所以要调整为数组中的从0开头.
  22. NSInteger index = self.curLevelNumber - 1;
  23. //依次取得关卡中的每个数据
  24. self.curLevelBrickCount = [levelsDataAry[index][kCurLevelBrickCount] intValue];
  25. [self initCurLevelEmenyCount:levelsDataAry[index][kCurLevelEnemyCount]];
  26. self.curLevelGPCount = [levelsDataAry[index][kCurLevelGPCount] intValue];
  27. self.curLevelLeftTime = [levelsDataAry[index][kCurLevelLeftTime] intValue];
  28. self.curLevelPassScore = [levelsDataAry[index][kCurLevelPassScore] intValue];
  29. }

代码很简单,就是依次分别读取level和player的数据然后设置对应的实例变量.

最后是写入数据的saveGameData方法:

  1. //将游戏数据写入磁盘
  2. -(void)saveGameData{
  3. //创建数据字典
  4. NSDictionary *dict = @{kBombExplodeRange:@(self.bombExplodeRange),
  5. kIsManualExplode:@(self.isManualExplode),
  6. kIsFearBomb:@(self.isFearBomb),
  7. kBombCountLimit:@(self.bombCountLimit),
  8. kLife:@(self.life),
  9. kIsPlayerSpeedUp:@(self.isPlayerSpeedUp),
  10. kCanPlayerAcrossBrick:@(self.canPlayerAcrossBrick),
  11. kCanPlayerAcrossBomb:@(self.canPlayerAcorssBomb),
  12. kPlayerTotalScore:@(self.playerTotalScore),
  13. kCurLevelNumber:@(self.curLevelNumber)
  14. };
  15. //将数据字典写入NSUserDefaults实例
  16. [[NSUserDefaults standardUserDefaults] setObject:dict forKey:kPlayerData];
  17. [self synchronize];
  18. }

该方法是读取方法的逆方法,最后调用了[self synchronize]来将内存中的数据刷入plist中,确保数据不会丢失.

游戏数据类是每个游戏都必不可少的功能类,可以考虑将其做成一个模板类来供不同程序的使用.

下一篇我们继续介绍游戏的其它部分,see you ;)

(NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示的更多相关文章

  1. (NO.00005)iOS实现炸弹人游戏(八):游戏主角(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近一直在做另一个RPG游戏,所以本系列迟迟没有更新,上一篇博 ...

  2. (NO.00005)iOS实现炸弹人游戏(三):从主场景类谈起

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我又粗粗看了下整个项目的代码,比较多: 不少类都与其他类有着千丝 ...

  3. (NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 从本篇开始我们一次介绍一下游戏中敌人的制作过程.看过第一篇的小 ...

  4. (NO.00005)iOS实现炸弹人游戏(五):游戏数据的初始化(二)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们现在来依次看一下上篇中提到的各个方法,首先介绍的是updat ...

  5. (NO.00005)iOS实现炸弹人游戏(四):游戏数据的初始化(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们初步看了一下MainScene类的初始化方法里都做了神 ...

  6. (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前面一篇里我们基本明确了游戏的大致玩法和特点.下面就游戏中会用到 ...

  7. (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计

    在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...

  8. (NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...

  9. (NO.00005)iOS实现炸弹人游戏(九):游戏主角(二)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上篇介绍了游戏主角的初始化方法,下面我们一次来实现主角的其他方 ...

随机推荐

  1. JS 实现点击页面任意位置隐藏div、span

    通过调用下面的 showhidden(“标签ID”) 显示div/span/…等标签内容,可以实现点击页面任意地方再次隐藏该标签内容,而showhidden(“标签ID”,”nohidden”)可保存 ...

  2. 笔记7 AOP练习<有疑问>

    场景描述: 核心业务:举行一场古典音乐会. 周边功能:观众入场,关闭手机.落座,觉得音乐好听时鼓掌,觉都不好听则退票.(切面) 1.编写切点(切点用于准确定位应该在什么地方应用切面的通 知)----即 ...

  3. Python IDLE背景主题

    相信刚进入python学习之路的朋友们,都还是挺喜欢python自带的IDLE,但是白的代码背景色以及其它的代码色确实让人看着有点不舒服,所以当时也琢磨着能不能自己给它换换颜色,这个当然可以,废话不多 ...

  4. Mysql B-Tree, B+Tree, B*树介绍

    [摘要] 最近在看Mysql的存储引擎中索引的优化,神马是索引,支持啥索引.全是浮云,目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB还支持B+Tree索引,Memory ...

  5. UMAIL安装教程

    UMAIL安装教程 一.UMAIL虚拟机的创建与安装 首先在VM中选择新建虚拟机 选择下一步 选择稍后安装操作系统 选择Linux系统 版本CentOS 7 64位 选择名称与安装位置 选择下一步 选 ...

  6. 关于java的Synchronized,你可能需要知道这些(上)

    对于使用java同学,synchronized是再熟悉不过了.synchronized是实现线程同步的基本手段,然而底层实现还是通过锁机制来保证,对于被synchronized修饰的区域每次只有一个线 ...

  7. 解读Batch Normalization

    原文转自:http://blog.csdn.net/shuzfan/article/details/50723877 本次所讲的内容为Batch Normalization,简称BN,来源于<B ...

  8. ZooKeeper之(一)ZooKeeper是什么

    1.1 产生背景 当今是个分布式.集群.云计算等名词满天飞的时代.造成这种局面的一个重要因素就是,单一机器的处理能力已经不能满足我们的需求,不得不采用由多台机器组成的服务集群.服务集群对外提供服务的过 ...

  9. DB 查询分析器7.01 新增的保存执行结果到多个文件功能

        1      引言   中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本< ...

  10. Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手

    Android图表库MPAndroidChart(一)--了解他的本质,方能得心应手 我们项目中经常会遇到一些统计图,比如折线图,线形图等,在一些运动健康类的App中尤其的常见,这画起来要命,我以前就 ...