3

私は現在、パーリン ノイズを使用して 2D ワールド ジェネレーター (サイド スクローラー) に取り組んでおり、まれな鉱石を地形全体に分散させたいと考えていますが、その方法が完全にはわかりません。

私が考えていたのは、2次元配列をループして世界を生成し、すべての数字(または数字の範囲)のリストを収集して配列に追加し、次に各数字/数字の範囲の希少性を判断することでした。しかし、そのような鉱石を置く...

それはただ遅いようで、より速く、より良い方法が必要ですある?

編集:私の質問を言い換える別の方法は、Minecraft がその鉱石をどのように正確に配置するか、およびパーリン ノイズを使用して 2D (側面から) ゲームでこれを行うための最良の方法は何かということです。

4

3 に答える 3

3

ランダムな確率に従って塊を配置できます。ただし、希少な鉱石の場合、これは広い地域には塊がなく、他の場所では希少な鉱石が比較的豊富であることを意味します。より良いアルゴリズムは次のようになります: ベース領域を確立し、許容可能な密度 (たとえば、領域ごとに 1 ~ 3 つのまれな塊) を決定し、領域ごとにまれな塊のランダムな位置を計算します。

例: 1000x1000 の領域ごとに 1 ~ 3 個のまれな塊が許容されると判断したとします。次に、これらの領域のすべてについて、まれな塊の数を1+floor(random*3)( where 0<random<1) として計算し、結果として生じるまれな塊のランダムな座標を計算します。たとえば、ランダム ノイズ ジェネレーターでは不可能な、まれな塊の間の最小距離として制約を追加することもできます。1 つのまれな塊が別のまれな塊に近すぎる場合は、その位置を再計算するだけです。

于 2012-09-13T18:56:25.697 に答える
1

Minecraft の地形は、数オクターブのパーリン ノイズ生成に基づいており、ストレッチによって平滑化されていると思います。洞窟や張り出しなど、特定の機能がさらにパスで追加されると思います。ランドスケープに適した出力を得るには、パーリンやその他のノイズ関数を試してみる必要がある可能性が非常に高いです。このようなノイズ関数の良い点は、与えられたシードを使用すると、一連の入力に対して予測可能で反復可能な出力が得られることです。つまり、Minecraft のように、ランドスケープを途切れることなくチャンクで生成できます。ここにもっとあります:https://gamedev.stackexchange.com/questions/28970/c-perlin-noise-generating-endless-terrain-chunks

鉱石の生成に関しては、鉱石の個々のタイルをランダムな加重分布で分散させると、あまり快適な結果が得られません。鉱石が自然に見える塊で生成されることを好む可能性が最も高いでしょう。これを行うには、Perlin を再度使用して、採掘可能な材料の局所的なポケットまたは垂直に伸びた鉱脈を生成します。関数をそのまま使用してランドスケープの高さマップをカットオフ ポイントとして使用することもできます (これにより、空中に鉱石ができてしまうことはありません)。または、1D ランドスケープ生成関数を別の入力としてフィードすることもできます。つまり、分布が異なる深さに合わせてスケーリングされた鉱石を生成できます。鉱石の希少性については、2D ノイズ出力からの異なるカットオフ値を使用して配置し、周波数と持続性の入力値を試すこともできます。

ここにある洞窟生成関数が好きです: http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/鉱石のパターンやその他の地下の特徴に似ていますが、このアプローチに従うと複雑さが増します。

編集:

最初のリンクは、あなた自身が gamedev に投稿した質問へのリンクかもしれません! あなたは同じジョンですか?:)

于 2012-09-08T20:47:45.007 に答える
1

Notch によるこのブログ投稿で述べられているように、Minecraft が地形を生成するために使用する正確な公式は秘密です。

2D Minecraft 風のゲームでこれを行う最善の方法は、パーリン ノイズを使用してブロックごとに世界を生成することだと思います (このチュートリアルをご覧ください)。次に、各ブロックが作成されたら、X と Y を別の関数に送信して、ブロック内に鉱石が存在する可能性を計算し、存在する場合はどの鉱石になるかを計算します。関数が鉱石を返す場合、その鉱石としてブロックを再作成できます。

これが役に立ったことを願っています。より具体的なコード例が必要な場合は、お知らせください。

于 2012-09-08T18:56:33.950 に答える