2013-07-11 4 views
6

죄송합니다. 그 제목이 그다지 설명이 없으면 죄송합니다. 어쨌든 무작위로 풍경을 생성하는 것을 다루고 있습니다. 나는 호수를 만들었지 만, 그들이 어떻게 만들어지기 때문에, 종종 직선/하강을 야기하며, 이는 바람직하지 않습니다. 가능한 한 호수를 만든 직후에 부드럽게하려고합니다. 최대 변화량을 정의하여 (육지의 높이가 그 이상 변화 할 수 없도록 함), 그것이 많이 달라지면 육지를 고치고 끝내면 종료합니다. 벌금.호수 주변의 땅을 부드럽게하기

문제 :

Large dropoff

내 시도 수정 :

Attempted fix

당신이 볼 수 있듯이 ... 그것은 작동하지 않았다. 호수가 단지 풍경을 가라 앉히기 때문에 그것이 실제로 일어나지 않아도되지만 그것은 내게 일어난다. 나는 내려야 만한다면 부서지기 쉽다고 생각한다. 단지 오른쪽이지만, 거의 동일해야합니다 왼쪽

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

참고 : 어쨌든, 여기 내 시도의 원천입니다. 이 작업을 올바르게 수행하려면 어떻게해야합니까?

도움을 주시면 감사하겠습니다.

는 편집 :

나는이 문제를 해결 결코하지 않았다. 대신, 나는 (특정 높이에서) 공기를 측정하기위한 재귀 함수를 만들었고, 물로 채우기에 충분한 공기 포켓 (육지에 의해 형성된)이 있다면. 이것은 변경되지 않았기 때문에 매끈하게 보이는 토지의 이점이 있습니다.

+0

rightBound 호수의 rightBound입니다 ... 희망이 도움이? 호수는 높이 0에서만 발생합니까? –

+0

@MikeSaull 네, 오른쪽 바운드는 가장 오른쪽 물의 x입니다. 호수는 0시에만 발생하는 것이 아니라 현재의 육지 높이와 호수 깊이로 보입니다. –

답변

1

이것은 자바로 작성되었으므로 C++로 변환해야하지만 기본 아이디어를 제공해야합니다. 그것은 단지 상향을 부드럽게하기 위해 작용할 것이다. 그리고 나는 단지 호수의 오른쪽을했다. 그러나 그것은 호수의 왼쪽을 위해 그것을 수정하는 것은 매우 쉽다. 나는 당신의 코드의 기능이 무엇이라고 생각하는지 맞추려고했다.

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