Cocos2d中的2D Terraria风格地形生成

3

我已经思考了一段时间。基本上,我正在尝试生成一个类似于Terraria中的基于瓷砖的二维地形。目前,我基本上只是生成一堆随机点,最终将成为地形的顶层,看起来像这样:

- (void)generatePoints
{
    float x = 0;
    float y = 0;
    self.topTerrainPoints = [[CCArray alloc] initWithCapacity:terrainKeyPoints];
    for (int i = 0; i < terrainKeyPoints; i++) {
        _terrainPoints[i] = CGPointMake(x, y);
        if (i != 0) {
            int newElevation = [self getRandomElevation];
            x += 64;
            y += newElevation;
            CCLOG(@"Point added!");
        }
    }
    [self populatePointsWithBlocks];
}

接下来,我会使用“块”(CCSprite的子类)来填充这些点。

- (void)populatePointsWithBlocks
{
    for (int i = 0; i < terrainKeyPoints; i++) {
        Block *tile = [[Block alloc] initWithType:kBlockTypeGrass];
        tile.position = ccp(_terrainPoints[i].x, _terrainPoints[i].y);
        [self addChild:tile];
        [self.topTerrainPoints addObject:tile];
        CCLOG(@"Tile added!");
    }
    [self fillInGround];
}

然后我会在每个块下面填写大约十层:

- (void)fillInGround
{
    for (int j = 1; j < terrainMaxDepth; j++) {
        for (int i = 0; i < terrainKeyPoints; i++) {
            CGPoint newPoint = CGPointMake(_terrainPoints[i].x, _terrainPoints[i].y - 64 * j);
            Block *dirt = [[Block alloc] initWithType:kBlockTypeDirt];
            dirt.position = newPoint;
            [self addChild:dirt];
        }
    }
}

这样可以产生不错的结果,但是我希望最终地下还能有洞穴和其他材料,如果你知道我的意思的话。
我有两个问题:
1. 这样生成地形明智吗?如果不是,我应该怎么做? 2. 如果这种方式创建地形没问题,那么我应该如何在已经生成的地形中添加洞穴和不同类型的方块?
希望这一切都说得清楚,我可以发布图片或回答你可能有的任何问题。
无论如何,谢谢!
编辑:有人吗?

一个进一步研究的起点:http://en.wikipedia.org/wiki/Voronoi_diagram - CodeSmile
这很有趣,我一定会仔细阅读的,谢谢。 - tallen11
你确定你需要地形生成吗?也许它并不适合你的游戏,但你可以使用像LevelHelper这样的工具预先创建关卡。你可以创建不同类型的方块,并对其进行编码,然后只需拖放即可创建你的关卡。 http://www.levelhelper.org/ - akuritsu
谢谢您的建议,但是我确实想要随机关卡生成。我希望像Terraria或Minecraft一样创建游戏。 - tallen11
1个回答

0

我之前做过类似的事情。您需要做的是一个网格,这样您就可以拥有像平铺地图一样的东西。因此,您将能够访问块1、4(但它在像素中的位置将不同)。

为此,您应该拥有一个二维数组。要在Objective C中实现这一点,您需要拥有一个包含其他NSArray的NSArray。第一个数组将是第二个数组对象的Y位置。 例如: [[blockArray objectAtIndex:2] objectAtIndex:5] 将获取坐标(2、5)处的块。

然后,您可以创建方法将网格坐标转换为cocos2D像素坐标或反之亦然。

使用此网格的主要原因是您需要随时访问某些块(例如将像素位置转换为我们网格中的位置),而不是使用所有数组(这将使游戏大大滞后)并检查块是否发生碰撞。

希望对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接