2013-07-11 34 views
6

Xin lỗi nếu tiêu đề đó không mang tính mô tả. Dù sao, tôi đang làm việc trên một cái gì đó đối phó với cảnh quan ngẫu nhiên tạo ra. Tôi đã làm hồ, nhưng do chúng được tạo ra như thế nào, chúng thường gây ra các cạnh/rớt thẳng, không mong muốn. Tôi đang cố gắng làm mịn nó (ngay sau khi làm hồ, nếu có thể), bằng cách xác định số lượng biến đổi tối đa (vì vậy chiều cao đất không thể thay đổi nhiều hơn), và sửa nó nếu nó thay đổi nhiều, và bỏ nếu nó là khỏe.Làm mịn đất xung quanh các hồ

Vấn đề:

Large dropoff

sửa chữa cố gắng của tôi:

Attempted fix

Như bạn có thể nhìn thấy ... nó đã không làm việc. Nó cũng xảy ra với tôi, tôi nghĩ rằng nó sẽ bị phá vỡ nếu nó phải di chuyển xuống, mặc dù trường hợp đó không nên thực sự xảy ra, bởi vì hồ chỉ bao giờ chìm phong cảnh. Dù sao, đây là nguồn gốc của nỗ lực của tôi:

//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; 

Lưu ý rằng chỉ phía bên phải, nhưng trái nên được về cùng. Làm thế nào tôi có thể làm điều này một cách chính xác?

Cảm ơn nếu bạn có thể trợ giúp.

EDIT:

Tôi chưa bao giờ giải quyết vấn đề này. Thay vào đó, tôi đã thực hiện một chức năng đệ quy để đo không khí, (từ một độ cao nhất định), và nếu một túi không khí (hình thành bởi đất) có đủ, để đổ đầy nước. Điều này có lợi thế của đất trông mịn vì nó không bị thay đổi.

+0

rightBound là rightBound của hồ? Do hồ chỉ xảy ra ở độ cao 0? –

+0

@MikeSaull Có, rightBound là x của nước ngoài cùng bên phải. Hồ không chỉ xảy ra ở 0, nhưng với chiều cao đất hiện tại và độ sâu hồ, nó trông như thế. –

Trả lời

1

Điều này được viết bằng java, do đó bạn sẽ cần phải chuyển đổi nó thành C++ nhưng nó sẽ cung cấp cho bạn ý tưởng cơ bản. Nó sẽ chỉ làm việc để làm mịn lên trên là tốt và tôi chỉ làm phía bên phải của hồ nhưng nó rất dễ dàng để sửa đổi nó cho phía bên trái của hồ. Tôi đã cố gắng để phù hợp với những gì tôi nghĩ rằng các chức năng của mã của bạn là.

Hy vọng nó sẽ giúp ...

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; 
    } 
} 
Các vấn đề liên quan