タイトルがあまり説明的でない場合は申し訳ありません。とにかく、私はランダムに生成される風景を扱うことに取り組んでいます。湖を作成しましたが、その作成方法が原因で、望ましくないストレート エッジ/ドロップオフが発生することがよくあります。最大変動量を定義して(可能であれば、湖を作成した直後に)滑らかにしようとしています(したがって、土地の高さはそれ以上変動することはできません)。変動が大きすぎる場合は土地を修正し、そうであれば終了します大丈夫。
問題:
私の試みた修正:
ご覧のとおり...うまくいきませんでした。それは私にも起こります。下に移動しなければならない場合は壊れると思いますが、実際には発生しないはずです。なぜなら、湖は風景を沈めるだけだからです。とにかく、ここに私の試みのソースがあります:
//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;
右側のみですが、左側もほぼ同じであることに注意してください。どうすればこれを正しく行うことができますか?
あなたが助けることができればありがとう。
編集:
私はこの問題を決して解決しませんでした。代わりに、(特定の高さから)空気を測定し、(土地によって形成された)空気のポケットが十分にある場合は水で満たす再帰関数を作成しました。これには、変更されていないため、土地が滑らかに見えるという利点があります。