(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 ...
随机推荐
- [APIO2016]
2016的题貌似是韩国棒子出的,好丧啊.... 看了题解还想了好久...... ------------------------------------------------- A.Boat 有n个 ...
- bzoj4361isn dp+容斥
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 370 Solved: 182[Submit][Status][Discuss] ...
- 图像融合之拉普拉斯融合(laplacian blending)
一.拉普拉斯融合基本步骤 1. 两幅图像L,R,以及二值掩模mask,给定金字塔层数level. 2. 分别根据L,R构建其对应的拉普拉斯残差金字塔(层数为level),并保留高斯金字塔下采样最顶端的 ...
- DCOM EXCE权限配置问题
检索COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005: 关于以上这个问题,博主在百度上 ...
- 运行eclipse java virtual machine launcher 什么错误
在MyEclipse的安装目录eclipse有个eclipse.ini文件原来的配置如下:-showsplashcom.genuitec.myeclipse.blue.product.ide--lau ...
- vue+cordova 构建hybrid app
配了一个 vue + cordova + ionicCli 的 项目 支持 ionic 的脚手架命令 支持 cordova 的 插件 安装使用 支持 webpack 的自动构建 vue 安装了 vue ...
- Luogu P1226 取余运算||快速幂_快速幂
超短代码 #include<iostream> #include<cstdio> using namespace std; long long b,p,k; long long ...
- Spring-cloud(六) Hystrix入门
前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 快速入门 项目搭建 搭建一个新maven项目,artifactid为Ribbon-c ...
- 克拉默法则(Cramer's Rule)的证明
克拉默法则: 先说一下为什么要写这个,作为一个大一新生,必须要学的就包括了线性代数,而且线性代数等数学知识对计算机专业也有很大帮助.但是在学习过程中遇到一个讲解的不清楚的知识点(Cramer's Ru ...
- Go 语言条件语句
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...