大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

假设认为写的不好请告诉我,假设认为不错请多多支持点赞.谢谢! 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文件里的,在下一篇我们来讨论.

查看原文