(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文件中的,在下一篇我们来讨论.

相关文章
|
10月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
976 4
|
JSON JavaScript 安全
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
140 1
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
288 0
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
186 6
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
694 1
|
Java iOS开发
iOS的数据序列化(又称持久化)的两类使用方式
iOS的数据序列化(又称持久化)的两类使用方式
146 0
|
Web App开发 小程序 Android开发
mPaaS小程序问题之接入iOS后阿里百川初始化报错如何解决
mPaaS小程序是阿里巴巴移动平台服务(mPaaS)推出的一种轻量级应用解决方案,旨在帮助开发者快速构建跨平台的小程序应用;本合集将聚焦mPaaS小程序的开发流程、技术架构和最佳实践,以及如何解决开发中遇到的问题,从而助力开发者高效打造和维护小程序应用。
240 1
|
JSON JavaScript 安全
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据