2D Terraria-стиль рельефа местности в Cocos2d - PullRequest
2 голосов
/ 06 ноября 2011

Я некоторое время ломал голову над этим.По сути, я пытаюсь, как следует из названия, создать двухмерный ландшафт на основе тайлов, как в 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. Если этот способ создания ландшафта в порядке, как именно я продолжу добавлять пещеры и блоки разных типов в уже сгенерированный ландшафт.

Я надеюсь, что все это имеет смысл, и я могу публиковать фотографии или отвечать на любые ваши вопросы.

В любом случае, спасибо!

РЕДАКТИРОВАТЬ: Кто-нибудь?

1 Ответ

0 голосов
/ 03 сентября 2014

Я сделал нечто подобное. То, что вам нужно будет сделать, это сетка, так что вы можете иметь как Tiled Map. Таким образом, вы сможете получить доступ к блоку 1, 4 (но его положение в пикселях будет другим.

Для этого у вас должен быть двумерный массив. Для этого в Objective C вам понадобится NSArray, содержащий другие NSArrays. Первый массив, будет Y-позицией объектов второго массива. Например: [[blockArray objectAtIndex:2] objectAtIndex:5] получит блок по координатам (2, 5).

Затем вы можете создавать методы для преобразования координат сетки в координаты пикселей cocos2D или наоборот.

Основная причина использования этой сетки состоит в том, что вам потребуется доступ к определенному блоку в любое время (например, перевод позиции в пикселях в позицию в нашей сетке) вместо того, чтобы использовать весь массив (ведь вам игра сильно отстает) и проверяет, не сталкивается ли блок.

Надеюсь, это поможет!

...