我一直困惑于此。基本上,正如标题所说,我试图生成一个基于图块的二维地形,如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];
}
}
}
这会产生不错的结果,但如果你知道我的意思,我想最终在地下也有洞穴和其他材料。
我有两个问题:
我希望这一切都有道理,我可以发布图片或回答您的任何问题。
无论如何,谢谢!
编辑:任何人?答案 0 :(得分:0)
我做过类似的事情。你需要做的是一个网格,所以你可以像一个平铺地图。因此,您将能够访问块1,4(但它的位置以像素为单位。
要做到这一点,你应该有一个二维数组。要在Objective C中执行此操作,您需要具有包含其他NSArrays的NSArray。第一个数组,将是第二个数组对象的Y位置。
例如:
[[blockArray objectAtIndex:2] objectAtIndex:5]
将在coord获得阻止(2,5)。
然后,您可以创建将网格坐标转换为cocos2D像素坐标或反之亦然的方法。
使用此网格的主要原因是您需要随时访问某个块(例如将像素位置转换为我们网格中的位置),而不是追求所有数组(巫婆将使您的游戏滞后很多)并检查一个块是否发生碰撞。
希望它有所帮助!