(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 ...
随机推荐
- Saltstack基础
salt介绍 salt简单介绍 一个基础平台管理工具 一个配置管理系统,能够维护预定义状态的远程节点 一个分布式远程执行系统,用来在远程节点上执行命令和查询数据 salt的核心功能 使命令发送到远程系 ...
- linux退出状态码及exit命令
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码.对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量.它的值会变成由shell所执行的最后一条命令的退出状态码: [ro ...
- 网易互联网&网易游戏产品经理面试经验
网易是分网易游戏和网易互联网的,本人都参加了校园招聘面试,最后均拿到了产品经理的offer. 网易是分网易游戏和网易互联网的,先说网易互联网吧,当时是去杭州总部进行面试,我觉得这是我面的最难的面试了. ...
- SQL Server数据库账号密码变更后导致vCenter Server无法访问数据库
SQL Server数据库账号密码变更后导致vCenter Server无法访问数据库 1.1状况描述: 若SQL Server数据库的账号(这里以sa为例)密码发生了变更,那么连接数据的客户端vCe ...
- MySql查询不区分大小写解决方案(两种)
当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查 ...
- logback学习二
转载:https://www.cnblogs.com/DeepLearing/p/5663178.html 属性 : debug : 默认为false ,设置为true时,将打印出logback内部日 ...
- 排序分析函数中对null的处理
--排序分析函数中对null的处理 --分析:对于null在分析函数中是升序默认是nulls last,降序默认是nulls first.如果不指定排序,那么是升序 )); ,'测试1'); ,'测试 ...
- 深入浅出低功耗蓝牙(BLE)协议栈
深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解蓝牙"连接"?如果蓝牙协议只有ATT没有GATT会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称 ...
- AutoMagic-开源自动化平台构建思路
最近在github上看到AutoMagic自动化平台开源了,一时手痒,就试着搭了一套环境,现在把思路和大家说一说. AutoMagic从其工作分工分两部分: 1:Web端管理平台 管理平台基于Pyth ...
- windows下python3.5使用pip离线安装whl包
0. 绪论 Windows离线断网环境下安装Python包,配置环境,准备用来生成word模版.姑且记录一下 生产环境 : windows 7 windows10 python 3.5.2 pip 1 ...