2011-11-06 34 views
2

我一直在困惑這一段時間。基本上,正如標題所說,我試圖生成一個基於瓦片的二維地形,如Terraria。截至目前,我基本上只產生一堆隨機點最終將地形的頂層,它看起來像這樣:2D在Cocos2d中生成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]; 
} 

我則繼續在大約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]; 
     } 
    } 
} 

這將產生不錯的結果,但我希望最終有洞穴和行吟詩人如果你知道我的意思,那麼地面材料也是如此。

我有兩個問題:

  1. 這是生成地形的一個明智的方法是什麼?如果不是,我該怎麼做?
  2. 如果這種創建地形的方式很好,我會如何着手將洞穴和不同的塊類型添加到已經生成的地形中。

我希望這一切都有道理,我可以發佈圖片或回答您可能遇到的任何問題。

無論如何,謝謝!

編輯:任何人?

+0

作爲進一步研究的起點:http://en.wikipedia.org/wiki/Voronoi_diagram – LearnCocos2D

+0

這很有趣,我一定會閱讀這個,謝謝。 – tallen11

+0

你確定你需要地形生成嗎?也許它不適合你的遊戲,但你總是可以使用像LevelHelper這樣的工具來事先創建關卡。您可以創建不同類型的塊並對其進行編碼,然後只需拖放即可創建級別。 http://www.levelhelper.org/ – akuritsu

回答

0

我做了類似的事情。你需要做的是一個網格,所以你可以像一個平鋪地圖。所以你將能夠訪問塊1,4(但它的位置將以不同的像素爲單位)

要做到這一點,你應該有一個二維數組,要在Objective C中做到這一點,你需要一個NSArray含有其他NSArrays第一陣列,將所述第二陣列的對象的Y位置 例如:。 [[blockArray objectAtIndex:2] objectAtIndex:5] 會得到一個塊在座標(2,5)

然後,可以創建方法來翻譯格coos to cocos2D像素座標或反之亦然

使用此網格的主要原因是您需要訪問cer (例如,將像素位置轉換爲網格中的位置),而不是追求所有的數組(女巫會讓你的遊戲滯後很多)並檢查一個塊是否發生碰撞。

希望它有幫助!