3

私はしばらくこれについて困惑してきました。基本的に、タイトルが示すように、 Terrariaのようなタイル ベースの 2 次元地形を生成しようとしています。現時点では、基本的に、最終的に地形の最上層となる一連のランダム ポイントを生成しているだけです。これは次のようになります。

- (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];
}

次に、各ブロックの下にある約 10 層を塗りつぶします。

- (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];
        }
    }
}

これでまともな結果が得られますが、最終的には地面に洞窟やその他の素材を入れたいと思っています。

2 つの質問があります。

  1. これは地形を生成する賢明な方法ですか? そうでない場合、どのようにすればよいですか?
  2. 地形を作成するこの方法で問題がなければ、既に生成された地形に洞窟やさまざまな種類のブロックを追加するにはどうすればよいでしょうか。

これがすべて理にかなっていることを願っています。写真を投稿したり、質問に答えたりできます。

とりあえずありがとう!

編集:誰か?

4

1 に答える 1

0

私はそれに似たようなことをしました。あなたがする必要があるのはグリッドなので、タイルマップのようにすることができます. したがって、ブロック 1、4 にアクセスできます (ただし、ピクセル単位の位置は異なります。

これを行うには、2 次元配列が必要です。Objective C でこれを行うには、他の NSArray を含む NSArray が必要です。最初の配列は、2 番目の配列オブジェクトの Y 位置になります。例: [[blockArray objectAtIndex:2] objectAtIndex:5] 座標 (2, 5) のブロックを取得します。

次に、グリッド座標を cocos2D ピクセル座標に、またはその逆に変換するメソッドを作成できます。

このグリッドを使用する主な理由は、すべての配列に頼る代わりに、いつでも特定のブロックにアクセスする必要があるためです (たとえば、ピクセル単位の位置をグリッド内の位置に変換するなど)。ロット) ブロックが衝突するかどうかを確認します。

それが役に立てば幸い!

于 2014-09-03T10:22:42.853 に答える