(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 ...
随机推荐
- 实现PC视频播放最强画质教程( Potplayer播放器+MADVR插件)【转】
转自:http://www.hangge.com/blog/cache/detail_1461.html 一.MADVR介绍 MADVR 是一款超强的视频插件,其配合高清播放软件,可以做到目前 PC ...
- 简介JSP与FreeMarker及Volicity区别
FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...
- 详解Tomcat配置JVM参数步骤
这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...
- 解决scroll在ios上卡顿问题和兼容ios不支持:active伪类情况
//有时候因为滚动层级元素过多会产生卡顿,特别在ios上十分明显,如果不想更换其他实现方式,可以加:-webkit-overflow-scrolling: touch; 开启硬件加速: 兼容ios不支 ...
- DEV中svg图标的使用
0.开始之前 先看看使用效果 在操作栏的使用: 在菜单中的使用 1.简述SVG图标 中文名:可缩放矢量图形 外文名:Scalable Vector Graphics 外语缩写:SVG 开发商:万维网联 ...
- 【DDD】--好文收藏
发现一批好文,完整系列,攒~~ 随笔分类 - DDD - 『圣杰』 DDD理论学习系列(1)-- 通用语言 笔记: 通用语言: a) 简单,便于理解.传播. b) 需要通用,能够准确的传达业务规则. ...
- Python中切片的工作原理
切片时的索引是在两个字符之间.左边第一个字符的索引为 0,而长度为 n 的字符串其最后一个字符的右界索引为n. 例如: +---+---+---+---+---+---+ | P | y | t | ...
- Linux下常用的配置
本文主要给出的都是一些常用的Linux配置,系统版本是基于CentOs6.3,供自己复习和新人学习,不当之处还请指正. vmware tools安装 虚拟机--->安装vmware tools ...
- 01_自动化构建工具之Maven
目前技术中存在问题(为什么使用Maven): 一个项目就是一个工程: 缺陷:如果项目太过庞大,就不适合使用package来划分层次,最好是一个模块就是一个工程,利于分工协作. 解决:Maven可以将一 ...
- Docker其它安全特性
除了能力机制之外,还可以利用一些现有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等. Docker 当前默认只启用了能力机制. ...