2013-07-11 24 views
6

Bu başlık çok açıklayıcı değilse üzgünüz. Her neyse, rastgele oluşturulmuş manzaralarla ilgili bir şey üzerinde çalışıyorum. Göller yaptım, ama nasıl yapıldığından dolayı, çoğu zaman arzu edilmeyen düz kenarlara/düşüşlere neden oluyorlar. (Varsa, gölü yaptıktan hemen sonra), bir maksimum varyasyon miktarını tanımlayarak (yani, arazi yükseklikleri bundan daha fazla değişmeyecek şekilde) düzeltmeye çalışıyorum ve çok fazla değiştiğinde araziyi düzeltmek zorundayım ve eğer varsa ince.Göller Etrafında Pürüzsüzleştirici Araziler

sorun:

Large dropoff

Benim teşebbüs düzeltme:

Attempted fix

Gördüğünüz gibi ... işe yaramadı. Aynı zamanda benim için de gerçekleşir, sanırım aşağı inmek zorunda olsaydı, bu durumun gerçekleşmemesi gerekiyordu, çünkü göller sadece manzarayı batırdı. Sadece sağ taraf olmakla yaklaşık aynı olmalıdır sol

//smoothing land nearby 

      int maxVariation = 2; //similar to the max height variation when the land is generated 

      //going right 



      for (int xPos = rightBound + 1, previousHeight = 0; ; ++xPos) 
      { 
       if (previousHeight == 0) 
        for (; previousHeight < size.y; ++previousHeight) 
         if (grid[0][rightBound][previousHeight] != BlockColor::DIRT && grid[0][rightBound][previousHeight] != BlockColor::GRASS) 
         { 
          --previousHeight; 

          break; 
         } 


       for (int y = 0; y < size.y; ++y) 
        if (grid[0][xPos][y] == BlockColor::WATER) 
         goto done_smoothing_right; 

       int height; 

       for (height = 0; height < size.y; ++height) 
        if (grid[0][xPos][height] != BlockColor::DIRT && grid[0][xPos][height] != BlockColor::GRASS) 
        { 
         --height; 

         break; 
        } 

        int difference = std::abs(height - previousHeight); 

        previousHeight = height; 

        if (difference > maxVariation) 
        { 
         for (int j = 0; j < size.y; ++j) 
         { 
          int toMove = difference; 

          while (j + toMove >= size.y) 
           --toMove; 

          grid[0][xPos][j] = grid[0][xPos][j + toMove]; 
         } 
        } 
        else 
         goto done_smoothing_right; 


      } 

done_smoothing_right: 

      int tomakegotowork; 

Not: Neyse, işte benim girişimi kaynağıdır. Bunu nasıl doğru yapabilirim?

Yardım ederseniz yardımcı olun.

DÜZENLEME:

ben bu sorunu çözmek yapmadım. Bunun yerine, havayı ölçmek için (belli bir yükseklikten) ve bir hava cebi (toprak tarafından oluşturulmuş) yeterliyse, su ile doldurmak için bir özyineleme işlevi yaptım. Bu, arazinin pürüzsüz göründüğünden, avantajlı olduğu için değişmiştir.

+0

rightBound gölün rightBound olduğunu ... Umarım yardımcı olur? Göller sadece yükseklik 0'da mı olur? –

+0

@MikeSaull Evet, rightBound en sağdaki suyun x'i. Göller sadece 0'da değil, halihazırdaki kara yüksekliği ve göl derinliği ile aynı görünüme sahiptir. –

cevap

1

Bu java'da yazılmıştır, böylece C++ 'ya dönüştürmeniz gerekecektir, ancak size temel fikri vermelidir. Sadece yukarı doğru düzeltmek için çalışacak ve ben sadece gölün sağ tarafını yaptım ama gölün sol tarafında bunu değiştirmek çok kolay. Kodunuzun işlevselliğini düşündüğüm şeyi eşleştirmeye çalıştım.

void smoothLakeRight(Lake lake){ 

    int x = lake.rightBound+1; 

    if(getGrassHeight(x)-lake.height>WorldConstants.MAX_LAKESIDE_VARIATION){ 
     //if the right bank is too high start smoothing 
     int y =lake.height+WorldConstants.MAX_LAKESIDE_VARIATION; 

     while(grid[0][x][y] == BlockColor.DIRT){ 
      fixGrass(x++, y++); 
     } 
    } 
} 

private int getGrassHeight(int xPos){ 

    int y = WorldConstants.LOWEST_GRASS; 

    while(grid[0][xPos][y++] != BlockColor.GRASS); 

    return y-1; 
} 

private void fixGrass(int xPos, int yPos){ 

    grid[0][xPos][yPos] = BlockColor.GRASS; 

    aboveAir(xPos,yPos); 
    belowDirt(xPos, yPos); 

} 

private void aboveAir(int xPos, int yPos) { 

    while(grid[0][xPos][++yPos]!=BlockColor.AIR){ 
     if(grid[0][xPos][yPos]==BlockColor.TREE){ 
      upRootTree(xPos, yPos); 
     }else{ 
      grid[0][xPos][yPos]=BlockColor.AIR; 
     } 
    } 
} 

private void upRootTree(int xPos, int yPos) { 

    while(grid[0][xPos][yPos]==BlockColor.TREE){//remove stump 
     grid[0][xPos][yPos++]=BlockColor.AIR; 
    } 

    //remove leaves 
    grid[0][xPos][yPos] = BlockColor.AIR; 
    grid[0][xPos+1][yPos] = BlockColor.AIR; 
    grid[0][xPos-1][yPos] = BlockColor.AIR; 
    grid[0][xPos+1][yPos-1] = BlockColor.AIR; 
    grid[0][xPos-1][yPos-1] = BlockColor.AIR; 
} 

private void belowDirt(int xPos, int yPos) { 

    while(grid[0][xPos][--yPos]!=BlockColor.DIRT){ 
     grid[0][xPos][yPos] = BlockColor.DIRT; 
    } 
} 
İlgili konular