zoukankan      html  css  js  c++  java
  • (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文件里的,在下一篇我们来讨论.

  • 相关阅读:
    Nginx源码编译安装
    nginx版本对比
    k8s中subpath挂载单个文件报错处理
    C++ array 数组函数
    洛谷 P2141
    c++ set容器
    字符串中输出每一个元素的方法
    string中的pop_back()函数
    如何去掉前导0 在字符串中 算法
    pat 乙级1074
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7388083.html
Copyright © 2011-2022 走看看