(NO.00005)iOS实现炸弹人游戏(六):游戏数据的初始化(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
现在我们来看看实际初始化地图的randomCreateMap方法:
//在空白地图上根据当前关卡数据随机创建一个关卡地图
//地图总共瓦块为30x10 = 300块,抛去不能移动的Wall(48块)还剩252块空格.
//还要减去player和敌人占去的空格.玩家出现在每一关的(0,0)瓦格上.
//为了保证player不至于卡死,(0,0),(0,1)和(1,0)三个空格不能放砖
//敌人位置也是不可以放砖的,所以
//最后可以放砖数量为 252 - 3 = 249 -> 249 - _gd.curLevelEnemyCount
-(void)randomCreateMap{
NSInteger rndIdx;
NSInteger brickCount = _gd.curLevelBrickCount;
CGPoint tmpTilePos;
NSAssert((brickCount <= 249-(_gd.curLevelFSCount+_gd.curLevelFSGhostCount)), @"too many bricks!!!");
//删除对象层(0,0)位置的占位砖
[self removeObjectAtTileCoord:ccp(0, 0)];
NSMutableArray *bricksAry = [NSMutableArray array];
//随机摆放砖块
for (int i = 0; i < brickCount; i++){
rndIdx = arc4random_uniform(_notWallTiles.count);
tmpTilePos = [_notWallTiles[rndIdx] CGPointValue];
[_objectLayer setTileGID:4 at:tmpTilePos];
[bricksAry addObject:[NSValue valueWithCGPoint:tmpTilePos]];
[_notWallTiles removeObjectAtIndex:rndIdx];
}
//随机摆放游戏道具
GameProperty *gp = [GameProperty sharedInstance];
GamePropertyType gpType;
for (int i = 0; i < _gd.curLevelGPCount; i++) {
gpType = [gp randomGP];
NSAssert(bricksAry.count != 0, @"剩下的砖块数目太少不足以放置剩余的道具");
rndIdx = arc4random_uniform(bricksAry.count);
tmpTilePos = [bricksAry[rndIdx] CGPointValue];
//随机摆放一个道具
[gp putGPAt:tmpTilePos InLayer:_propertiesLayer type:gpType];
//该砖块下已有道具,所以将其从bricksAry中排除出去
[bricksAry removeObjectAtIndex:rndIdx];
}
//将_propertiesLayer (0,0)位置的占位瓦块删掉
[gp removeGPAt:ccp(0, 0) InLayer:_propertiesLayer];
NSInteger exitTileID = [_underObjectsLayer tileGIDAt:ccp(0, 0)];
rndIdx = arc4random_uniform(bricksAry.count);
tmpTilePos = [bricksAry[rndIdx] CGPointValue];
//随机摆放出口
[_underObjectsLayer setTileGID:exitTileID at:tmpTilePos];
[bricksAry removeObjectAtIndex:rndIdx];
_exitTilePos = tmpTilePos;
//将_underObjectsLayer (0,0)位置的占位瓦块删掉
[_underObjectsLayer removeTileAt:ccp(0, 0)];
}
额…为了不造成困惑,我特意做了比较详细的注释,我们还是依次来看看代码吧.
首先一个断言确保有足够数量的砖块可供使用,因为砖块下面要放置道具和出口,如果砖块太少就不能完全覆盖住底下的道具了.
然后将地图对象层的(0,0)位置的瓦块删除掉.为什么要在地图层中放置一块用不到的瓦块呢?因为Tiled工具有点小问题,我前面的博文里也讲过了.如果在某一层中开始什么瓦块都不放,而希望运行时动态增加瓦块是不可行的.
我也曾试验过,虽然Cocos2D中自带的瓦块地图方法里有像某一层关联一个地图集的方法,但实际操作却不成功,总是失败.
所以这里我们先在Tiled里放置一块瓦块,这样等于关联了一个地图集,接下来在运行的时候就可以随意增减其他瓦块了.
回到代码流中,接下来根据当前关卡中指定砖块的数目随机初始化砖块.
同样的,后面是随机摆放道具的代码,根据指定道具的数量来摆放.这里可以再”真实”一些,根据道具的稀有程度的概率产生道具,否则一些通关道具随便一大堆,会使游戏平衡性大打折扣.
最后是出口的摆放,并将生成好的出口坐标保存到_exitTilePos实例变量中,便于以后操作.
游戏初始化内容大致就是这些了,很多童鞋可能会想游戏的数据是从哪里来的,这个实际是放在plist文件中的,在下一篇我们来讨论.
(NO.00005)iOS实现炸弹人游戏(六):游戏数据的初始化(三)的更多相关文章
- (NO.00005)iOS实现炸弹人游戏(八):游戏主角(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近一直在做另一个RPG游戏,所以本系列迟迟没有更新,上一篇博 ...
- (NO.00005)iOS实现炸弹人游戏(三):从主场景类谈起
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我又粗粗看了下整个项目的代码,比较多: 不少类都与其他类有着千丝 ...
- (NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 从本篇开始我们一次介绍一下游戏中敌人的制作过程.看过第一篇的小 ...
- (NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用plist列表文件来表示游戏数据 因为在这个炸弹人游戏中有很多 ...
- (NO.00005)iOS实现炸弹人游戏(五):游戏数据的初始化(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们现在来依次看一下上篇中提到的各个方法,首先介绍的是updat ...
- (NO.00005)iOS实现炸弹人游戏(四):游戏数据的初始化(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们初步看了一下MainScene类的初始化方法里都做了神 ...
- (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前面一篇里我们基本明确了游戏的大致玩法和特点.下面就游戏中会用到 ...
- (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...
- (NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...
随机推荐
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...
- django rest-framework 2.请求和响应
一.请求对象 REST 框架引入Request来扩展常规的HttpRequest,并提供了更灵活的请求解析.Request对象的核心功能是request.data属性. 导入方式: from rest ...
- Python Web学习笔记之多道程序设计技术和操作系统的特性
采用了多道程序设计技术的操作系统具有如下特性 : ① 并发性.它 是指两个或两个以上的事件或活动在同一时间间隔内发生.操作系统是一个并发系统,并发性是它的重要特征,操作系统的并发性指计算机系统中同时存 ...
- python中没有字符(char)这一基本数据类型
感觉受C语言的影响太大了,一开始以为python中也会有字符这一基本数据类型,后来遇到了很多问题,这才发现python中压根没有这一数据类型( ╯□╰ ). 吐槽一下:感觉python还真是'够简单啊 ...
- JSSDK实现微信自定义分享---java 后端获取签名信息
一.首先说下关于微信Access_token的问题,微信Access_token分为2中: 1.授权token获取方式: 这种token需要code值(如何获取code值查看官方文档) "h ...
- js删除数组中的元素delete和splice的区别
例如有一个数组是 :var textArr = ['a','b','c','d']; 这时我想删除这个数组中的b元素: 方法一:delete 删除数组 delete textArr[1] 结果为: ...
- Windows转Linux总结(附带常用Linux命令-LinuxMint)
这是我在Linux系统下写的第一篇博客,花了一周的时间从Windows系统转到Linux并且可以完成日常操作,能在Linux系统下完成开发,运用各种开发工具,写各种语言小程序和JavaEE. 经过这一 ...
- CentOS 7 配置网络连接
在VMware workstation12上新建虚拟机,发现无法连接网络.然后查了一些资料,知道了怎样配置网络,记录一下. 1.首先用ifconfig命令查看虚拟机的IP地址及网关信息 观察显示内容, ...
- 基本数据类型 异常 数组排序 JVM区域划分
Day01 1.基本数据类型各占几个字节 Byte 1 short2 int4 long8 float4 double6 char2 boolean1 Byte b1=3,b2= ...
- Kinect 深度图像格式
Kinect的深度图像有16bit,2byte,如图: 第15位:标志位,不用做深度计算 第14~3位:深度图像数据,即距离,以毫米为单位 第0~2位:深度图中人的ID(PlayerID) 深度图有两 ...