ゲヌム甚に倧陞の地図を䜜成した方法

画像






パヌト1. SVGず座暙系



最近たで、私のドラゎンズアバりンドゲヌムのマップサむズは修正されおおり、やや非決定的でした。 私はそれらを「地域」であるず考えたした-党䞖界の地図ではなく、䟋えばアメリカの西海岞やペヌロッパの䞀郚などの重芁な郚分です。 私はこのスケヌルにかなり満足しおいたしたが、ゲヌムを少し実隓しお、党䞖界たたは少なくずももっず倧きなマップを生成できるかどうかを確認したかったのです。 しかし、始める前に、ファンタゞヌの䞖界地図に぀いお少し話したしょう。



䞖界は倧きな空間です。 ファンタゞヌの「䞖界」カヌドのほずんどは、実際のサむズにさえ近いものではありたせん。 たずえば、ロヌドオブザリングアクションが行われる䞭぀囜を考えおみたしょう。









巚倧な䞖界がそこに捕らえられおいるように芋えたすが、実際には、䞭぀囜はペヌロッパに基づいお䜜成されたした。









぀たり、トヌルキン䞖界の「䞖界」の実際の地図は、䞭぀囜の地図の玄50倍になりたす。 実際、私が芋たファンタゞヌ䞖界地図のほずんどは、倧陞の倧きさに関する領域を衚瀺しおいたす。









これは、ファンタゞヌカヌドスタむルで芖芚化された最倧の領域のようです。



぀たり、実際の「䞖界地図」を生成するタスクはおそらく野心的すぎるでしょう。 倧陞たたは倧陞の䞀郚の地図を䜜成するこずを目指した方が良いでしょう。 ただし、カヌドを「䞖界」のサむズず芋なす方が䟿利です。カヌドのサむズはどうすればよいですか 珟圚のDragons Aboundカヌドが「亜倧陞」サむズである堎合、8〜10倍倧きいカヌドを生成する必芁があるず想定できたす。



倧きなマップを生成するタスクに進む前に、ゲヌムで䜿甚されおいるさたざたな座暙系をよりよく理解する必芁がありたす。 私は、Martin O'Learyの゜ヌスコヌドから倚くの座暙系を借りたした。それらの盞互䜜甚は、2幎間䜜業しおも混乱を招く可胜性がありたす。 通垞、私はそれらを実隓せずに䜕ずかしたしたが、倧きなマップを生成するにはこれを行う必芁があるこずは明らかです。



たず、地域マップの「䞖界」は珟圚、単䜍正方圢内で生成されおいたす。 各地域マップには-0.5、-0.5から0.5、0.5たでの座暙があり、原点0,0は地域の䞭倮にありたす。









ここで奇劙な点の1぀は、Y軞が孊校のゞオメトリで調査したものず比范しお反転しおいるこずです。 -0.5はマップの䞊郚にあり、0.5は䞋郚にありたす。 コンピュヌタグラフィックスでは、Y軞はしばしば反転したす。 これは、最初のモニタヌTVが䞊から䞋ぞスキャンを実行する方法、぀たり、最初のスキャンラむンが䞊、そのすぐ䞋にあるなど、぀たり、スキャンラむンのむンデックスYが䞊でれロからある正の数に倉わった方法によっお説明されるず聞きたした䞋に。 SVGScalable Vector Graphics圢匏でも同じ座暙系が䜿甚されおいるため、 Dragons Aboundも䜿甚されおいたす。



この座暙系は、マップの衚瀺方法ずは無関係です。 これは、䞖界を䜜成するための無次元のシステムです。郜垂は0.12875、-0.223に䜍眮し、境界は0.337、0.010から0.333、0.017に移動したす。 たた、私の珟圚の地域マップは0.5〜-0.5の範囲に制限されおいたすが、これは座暙系の制限ではありたせん。 これらの境界を越えお䞖界を䜜るこずができたす。



次の座暙系は、SVGがビュヌボックスず呌ぶものです。 グラフィックの描画に䜿甚される真の座暙を蚭定したす。 たずえば、最初のDragons Aboundはビュヌボックスを座暙-500、-500に蚭定し、幅が1000、高さが1000です。









写真にタむプミスがありたす。Y軞の䞊郚は-500である必芁がありたす。申し蚳ありたせん。



この堎合、1番目ず2番目の座暙系の間の倉換は、すべおに1000を掛けるだけであるこずに気付くかもしれたせん。 䜕かを描画するために、ゲヌムはこのオブゞェクトの座暙を芋぀け、それらに1000を掛け、これらの座暙にSVGを描画したす。



぀たり、ビュヌボックスの座暙を䜿甚しお、0、0から250、250に線を匕くこずができたす。 しかし実際には、コンピュヌタヌ画面に0、0から250、250に線を匕きたくありたせん。 これは、画面䞊の別のポむントで地図を衚瀺したい堎合、すべおの地図オブゞェクトの座暙を倉曎しお再描画する必芁があるこずを意味したす。 それは倧きな仕事です。



画面にグラフィックを衚瀺する座暙を制埡するために、SVGにはビュヌポヌトず呌ばれる3番目の座暙系がありたす。 ビュヌポヌトは、グラフィックを描画するペヌゞの䞀郚ですWebペヌゞでは、これは<svg>芁玠です。 幅、高さ、堎所がありたす。 堎所は、ビュヌポヌトの巊䞊隅の座暙です。 ぀たり、高さおよび幅が800の座暙30、100でビュヌポヌトにマップを衚瀺するず、ビュヌポヌト座暙系は次のようになりたす。









SVGでは、座暙系のビュヌボックスずビュヌポヌトは互いに接続されおおり、SVG自䜓がそれらの間の遷移を凊理したす。 ビュヌボックス座暙系で描画するだけで、レンダリングされたすべおが察応するビュヌポヌトの堎所に衚瀺されたす。 異なるアスペクト比でビュヌボックスずビュヌポヌトを䜜成するず、いく぀かの問題が発生したす。その埌、 preserveAspectRatio



属性の倀に応じお、オブゞェクトが切り取られるか匕き䌞ばさpreserveAspectRatio



たす。これをたったく行わないこずをお勧めしたす。



芁玄するず、䞖界座暙0.10、0.33にある郜垂は、座暙100、330で描画され、110、764で画面に衚瀺されたす。



これでなぜ混乱するのか理解できるようになりたした



これらの各座暙系を倉曎するずどうなりたすか 最初の座暙系で、各軞に-0.25から0.25の範囲の䞖界を生成するずしたす。 次に、結果の䞖界は通垞の䞖界の4倍小さくなり、ビュヌポヌトの䞭倮郚分のみを埋めたす。









通垞は非衚瀺になっおいる゚ッゞのアヌティファクトも確認できたす。同様に、最初の座暙系SKのサむズを2倍にするず、ビュヌポヌトの゚ッゞの倖偎にあるため、ほずんどのマップは衚瀺されたせん。



ビュヌボックスのサむズを2倍にするずどうなりたすか たあ、最初のSCずビュヌボックスの比率を2倍にした堎合1000から2000、䜕も倉わりたせん。 比率が1000のたたである堎合、マップは再び半分になりたす。









ただし、今回のカヌドの初期領域は1x1です。 ここでも、通垞は隠れおいる゚ッゞたずえば、森林の凞郚にアヌティファクトが芋られたす。 たた、海掋のパタヌンが間違っおいるこずもわかりたす。ビュヌボックスのサむズに぀いお、いく぀かの前提を固定しおおく必芁がありたす。 さらに、コンパスはマップの角ではなく、ビュヌボックスの角にあるようです。



逆に、ビュヌボックスのサむズを半分に枛らすず、マップズヌム効果が䜜成されたす。









ここでは、マップの䞭倮四半期のみが衚瀺されたす。 これはズヌムするのにあたり䟿利な方法ではありたせん。マップの半分だけに問題が衚瀺されるためです。たずえば、郜垂マヌカヌ「South Owenson」が画面を超えおいたす。 さらに、フォントや私が必芁ずしない他のもののサむズを2倍にしたす。



ビュヌボックスのより䟿利な偎面は、原点の倉曎です。 これたで、ビュヌボックスはマップの䞭倮に配眮されおいたしたが、これは必須ではありたせん。 たずえば、マップの巊偎のポむントにビュヌボックスの䞭心を眮くこずで、マップを右に移動できたす。









境界線やその他の問題ぞの圱響に再び気付くこずができたすが、本質的にマップは右に移動したした。 これの有甚性は明らかではないかもしれたせんが、幅が通垞のマップの幅の2倍であるマップを生成するず想像しおください。 デフォルトでは、次のようになりたす。









他の地図のように芋えたすが、実際には倧きな地図の䞭心郚分にすぎたせん。 ぀たり、ビュヌボックスを倉曎しお、マップの他の郚分を抂芁りィンドりに転送できたす。









ここでは、芖点を巊に移動したため、元のビュヌの東の䞖界の䞀郚が衚瀺されたす。 Dragons Aboundは、衚瀺されおいるかどうかに基づいお特定の機胜たずえば、オブゞェクトに名前を付けるを実行するため、マップ䞊の䞀郚の名前が倉曎されおいたす。 ビュヌボックスを移動するずきにマップが䞀定になるように、これを倉曎する必芁がありたす。 ただし、埌で倧きなマップでビュヌボックスを移動し、必芁な゚リアの地域マップを生成できたす。 ぀たり、倧陞のサむズの倧きな地図を生成しお衚瀺できたすが、倧きな地図内の地域の地域地図も生成できたす。



芁玄するず、ゲヌムは3぀の座暙系を䜿甚したす。 1぀は、䞖界のオブゞェクトの抜象SCです。 2぀目はビュヌボックスで、䞖界の可芖領域を定矩したす。 3番目はビュヌポヌトであり、画面䞊のどこにマップを描画するかを制埡したす。 より倧きな䞖界を描くには、最初のSCを拡匵する必芁がありたす。 画面にさらに衚瀺するには、ビュヌボックスを展開する必芁がありたす。 ビュヌボックスを移動しお、倧きな䞖界のさたざたな郚分を衚瀺するこずもできたす。



パヌト2.カヌドを氞続的にする



前のパヌトでは、座暙系を調査し、ビュヌポヌトSVGを移動しお倧きな䞖界の個々の郚分のみを衚瀺する方法を孊びたした。 ただし、このアプロヌチにはいく぀かの問題がありたす。以前私は、目に芋えないものはすべお重芁ではないず考えおいたためです。 このパヌトでは、これらの前提を排陀しお、䞍倉の倧きなマップのさたざたな郚分を生成および衚瀺できるようにしたす。



前のパヌトで説明した名前の配眮の問題は、明らかに次の2぀のタむプの1぀のカヌドで顕著です。









同じ䞖界がありたすが、ビュヌだけが巊にシフトされおいたす。









地理は同じですが、倚くの名前が倉曎されおいるこずに気付くかもしれたせん。 2぀のタむプでは異なるオブゞェクトが衚瀺され、名前の䜜成プロセスは乱数によっお制埡されるため、異なる名前が取埗されたす。



コヌドを芋るず、可芖性に応じおほずんどすべおのオブゞェクトに名前が付けられおいるこずがわかりたした。 ただし、埌続のすべおのオブゞェクトに名前を付けるこずが困難になる䟋倖は1぀だけです。 私たちの堎合、䟋倖はDragons Aboundが目に芋える海岞線のみを生成するこずです。 この理由は非垞に玛らわしいです。 実際、䞖界の端に沿っお「海岞線」がありたすが、この行を䜜成するず、プログラムロゞックの䞀郚が砎壊されたす。これは、䞖界党䜓を包含するためです。 これを避けるため、目に芋える海岞線のみを生成したした。 マップがビュヌポヌトをはるかに超えお拡倧できるようになったため、この゜リュヌションは芋栄えがよくありたせん。 代わりに、マップの実際の端に近づくず、海岞線の生成を停止する必芁がありたす。 ただ画面の倖に出お、端の問題を隠したす。



この問題を解消した埌、2枚のカヌドの名前は䞀定のたたです。









そしお









将来の泚意点 むンタラクティブ機胜を䜿甚しおマップオブゞェクトの名前を倉曎した堎合、この倉曎は珟圚の圢匏で再䜜成されず、おそらく再珟できたせん。 怜蚎する䟡倀がありたす。



前のマップをよく芋るず、マップの䞭倮䞋郚近くの海域には、「Meb Island」ずいう垂れ䞋がったラベルが付いおいるこずがわかりたす。 それは、 ドラゎンズアバりンドが実際に海の領域は島であるず信じおいるために起こりたした。 技術的な詳现は説明したせんが、地図を超えお島ず湖を区別するこずは驚くほど困難です。 このアルゎリズムは、目に芋えない海岞線の生成に加えた倉曎を混乱させたす。このような問題を回避するには、修正する必芁がありたす。



次に、マップのサむズを4倍にしお、マップりィンドりにその4分の1のみを衚瀺したす。









䞀般に、すべおがきれいに芋えたすマップ䞊に興味深い川のシステム、倧きな湖がありたすが、郜垂は非垞にたれであるこずがわかりたす。 ドラゎンズアバりンドは10〜20の郜垂を生成するために発生したした。サむズが4倍倧きい堎合、䞖界の盞察的なサむズに応じお間隔を倉曎する必芁があり、おそらく耇数の堎所で行う必芁がありたす。



問題を修正した埌の同じカヌドを次に瀺したす。









マップ䞊には、より論理的な数の郜垂および町がありたすが、これは別の問題を瀺しおいたす。 マップの端には、巊䞋隅にあるNanmrummombrook、Marwynnley、Noyewoodなど、倚くの䜙分な名前が衚瀺されたす。 これは、配眮コヌドメ゜ッドが衚瀺されおいる堎所に配眮しようずするために発生したす。 以前は、この手順では、画面の倖偎のラベルに぀いお心配する必芁はありたせんでした。これは、地域サむズのマップでは通垞、党䞖界が衚瀺されるためです。 しかし、珟圚では、画面倖に郜垂やその他のオブゞェクトが配眮されおいる堎合がありたす。 したがっお、䞍可芖マップオブゞェクトのラベルを䜜成しようずしないロゞックをラベル配眮プロシヌゞャに远加する必芁がありたす。









今、絵はより論理的です。 右偎では、Cumdenはマップ䞊でほずんど芋えたせんが、ラベルは衚瀺されおいる堎所にありたす。



倧きな地図ではすぐに気付かない偎面が1぀ありたす。䞖界の堎所の数は倉曎されおいたせん。 マップはある意味では4倍倧きくなりたしたが、その合蚈面積は同じ数の堎所によっお制限されおいたす。 マップ生成の初期段階は、䞀定数のロケヌションを持぀ボロノむ図で䞖界をカバヌするこずでした。 ぀たり、マップが倧きくなるず、ボロノむのセルも倧きくなりたす。



マップサむズに応じおロケヌションの数をスケヌリングするこずは論理的ですが、残念ながら、 ドラゎンズアバりンドの実行速床のロケヌション数ぞの䟝存性は線圢よりもはるかに悪いです。぀たり、倚数のロケヌションを持぀マップの生成には倚くの時間がかかる可胜性がありたす。 以䞋は、クアッド解像床堎所の数のカヌドの䟋です。









远加された堎所は生成プロセスを倉曎するため、地圢は䞊蚘のマップずは異なりたすが、海岞では远加された詳现を確認できたす。



幞いなこずに、倧きなカヌドを生成するパフォヌマンスをプロファむリングするずき、プロセッサ時間のほずんどが明らかな問題に費やされおいるこずに気付きたした。 デバッグ埌、私は最も邪魔なものを削陀したした。これにより、マップをさらに䜜成するこずができたした。 これが4xカヌド党䜓です。









ズヌムは25です。 Chromeが衚瀺できるおおよその最倧マップサむズのように芋えたす。 ワヌルド生成手順では、より倧きなマップを凊理できたすが、それらを衚瀺しようずするず、ブラりザヌがクラッシュしたす。 この意味で、Firefoxはより機胜的なようです。 元のサむズの9倍のサむズのカヌドを衚瀺できたす。 ここにそのようなカヌドの䞀郚がありたす-私はフルサむズのたたにしたので、サむズず詳现をよりよく理解するために別のりィンドりで開くこずができたす。









Firefoxはこのサむズのマップを生成できたすが、スクリヌンショットはブラりザヌりィンドりの最倧サむズでしか撮圱できたせん。 マップをPNGファむルずしお保存する機胜がありたすが、マップの衚瀺された郚分のみを保存できたす。 マップをスクロヌルし、個々の画面をキャプチャしおそれらを接続するこずはできるず思いたすが、時間がかかりたす。



最良の解決策は、SVG自䜓を保存しお、Inkscapeなどのプログラムで開くこずができるようにするこずです。



以前はSVGマップをInkscapeにカットアンドペヌストできたしたが、䞖界地図甚のSVGは非垞に倧きいため、ブラりザをカットしようずするずクラッシュしたす。 幞いなこずに、 FileSaver.jsを芋぀けたので 、それを䜿甚しおSVGを盎接ファむルに保存しおからInkscapeで開くず、非垞に倧きな画像が䜜成されたす。



少なくずも理論的には。 Inkscapeでこれらのマップを開こうずするず、いく぀かの問題が発生したす。



最初の問題は、SVGを開く方法においお、Inkscapeの前提がChromeおよびFirefoxの前提ず異なるこずです。 特に、パスで塗り぀ぶしの色が指定されおいない堎合、ブラりザは塗り぀ぶしがないず芋なしたす。 Inkscapeは、アりトラむンが黒で塗り぀ぶされおいるず想定しおいたす。 したがっお、保存したSVGをInkscapeで開くず、マップの最䞊局に塗り぀ぶしの色が含たれおいないため、ほずんど完党に黒になりたす。 これは、ブラりザずInkscapeの䞡方でアりトラむンが等しく衚瀺されるように、必芁な堎所に「fillnone」を指定するこずで修正できたす。



2番目の問題は、Inkscapeのマスク凊理で゚ラヌが発生するこずです。 Inkscapeは1぀の芁玠のみでマスクを䜜成するようであり、耇数の芁玠を持぀マスクを適切に凊理したせん。 Dragons Aboundは、いく぀かの芁玠を持぀倚くのマスクを䜜成したす。 この問題を回避するには、各ゲヌムマスクのすべおの芁玠を1぀のオプションのグルヌプ芁玠にグルヌプ化したす。



3番目の問題は、画像やその他のダりンロヌド可胜なリ゜ヌスに関連しおいたす。 元のSVGでは、それらぞの参照は、「images / background0.png」などの盞察圢匏で瀺されたす。 私の゜ヌスは、 䜿甚する別のWebサヌバヌが指定された堎所でこれらのリ゜ヌスを芋぀けるこずができるように配眮されおいたす。 同じSVGを取埗しおInkscapeで開くず、これらの盞察パスはURL「file」ずしお扱われ、InkscapeはSVGが保存されたフォルダヌに関連するリ゜ヌスを怜玢したす。 この問題は、適切な堎所に既にリ゜ヌスがあるフォルダヌにSVGを保存するこずで簡単に回避できたす。 Webサヌバヌが䜿甚するのず同じルヌトフォルダヌでも、同じ盞察パスに沿っおリ゜ヌスのコピヌがある別の堎所でもかたいたせん。



4番目の問題はフォントです。 Dragons Aboundは、Webフォントずロヌカルに保存されたフォントの䞡方を䜿甚したす。 䞡方ずもWOFF2圢匏です。 ブラりザでは、CSSフォントファミリスタむルを䜿甚しおテキストに適甚され、マップを生成する前に、䜿甚可胜なすべおのフォントがWebペヌゞにアップロヌドされたす。 ゲヌムで同じファむルを開くず、システムフォントディレクトリでフォントが怜玢され、別のフォントディレクトリを指定するこずはできたせん。 少なくずも私が開発しおいるマシンでは簡単な解決策は、ゲヌムで䜿甚されるフォントをシステムフォントディレクトリにむンストヌルするこずです。 ただし、フォント名は䞀臎する必芁があるため、芋た目ほど単玔ではありたせん。Windowsでは、フォント名を倉曎する簡単な方法はありたせん。 ただし、もちろん、このようなスキヌムは、必芁なフォントがすべおむンストヌルされおいないコンピュヌタヌでは機胜したせん。 よりポヌタブルな゜リュヌションは、マップにSVGフォントを埋め蟌むこずです。 これは私のTODOリストに茉りたす。



最終的に、私はこのマップ生成むンタヌフェヌスに来たした









゚クステント入力フィヌルドは、ワヌルドの合蚈サむズを指定したす。1x1は゜ヌスマップのサむズです。 vbxビュヌボックスのサむズは、マップに衚瀺される䞖界の断片のサむズを決定したす。 スクリヌンショットでは、1x1の倀も持っおいたす。぀たり、マップは党䞖界を衚瀺したす。 vbx centerフィヌルドは、䞖界のマップセンタヌの䜍眮を指定したす。 0、0は䞖界の䞭心です。 最埌に、SVGオプションは、1ビュヌボックスサむズ単䜍あたりの画面ピクセル数を指定したす。 倀が775の堎合、1x1マップが775x775ピクセルの量で画面に衚瀺されたす。 これは、非垞に倧きなマップを䜜成するずきに䟿利です。 パラメヌタヌを䜎い倀たずえば、150ピクセルに蚭定するこずで、画面党䜓に倧きなマップを収めるこずができたす。



これらの6぀のパラメヌタヌを倉曎するこずで、䞖界のサむズず、地図に衚瀺される䞖界の䞀郚を制埡できたす。 [生成]ボタンは、予想どおりに機胜したす。 衚瀺ボタンは、単に䞖界の䞀郚を衚瀺したす。぀たり、䞖界を生成し、その個々の郚分を衚瀺しお、䞖界を再生成するこずなくビュヌボックスパラメヌタを倉曎できたす。 プログラマは、これをスケヌリングずスクロヌルずしお実装する方が適切です。[PNGを保存]ボタンは、衚瀺可胜なマップをPNGファむルずしお保存したす。 [SVGの保存]ボタンは、マップ党䜓のSVGファむルを保存したす。 Test Itボタンは、さたざたな機胜の開発䞭に倉曎されるテストコヌドを実行するために䜿甚されたす。



倧きな䞖界のすべおの郚分を生成しお反映できるようになったので、次に、地圢をより倧きな地図に適合させるこずに進みたす。



パヌト3.寿叞フォヌム



前の郚分でさたざたな倉曎を行ったので、前の䞖界よりもはるかに倧きい䞖界最倧8倍を生成し、倧きなグラフィックむメヌゞずしお保存できるようになりたした。





Flickrで最倧解像床4800x2400でマップを衚瀺するには、別のりィンドりで画像を開きたす。



地域マップを䜜成したのず同じ手順生成を䜿甚しお、これらのマップを生成したす。 䞊に瀺した地図は、かなり芏則的な倧陞の圢ずいく぀かの興味深い倖島を持っおいたす。 ただし、それはほずんど運に䟝存したす。 別のマップを次に瀺したす。





このカヌドは、島々ずスむスの寿叞チヌズの混です。



もう1぀の䟋は、前の2枚のカヌドの間にあるものです。 それは完党に珟実的ではありたせんが、幻想的な環境にずっお興味深いかもしれたせん





これは倧陞の巚倧な土地ですが、奇劙な圢の土地がかなりあり、䞀般的に䞖界はたったく「リアル」に芋えたせん。 誰かにずっお、そのような䞖界はファンタゞヌに非垞に適しおいるように思えたす。では、䞖界地図にはどのような圢が必芁でしょうか



私が芋た空想の䞖界地図のほずんどは、たずえば次のアンデレン地図のような倧きな島の倧陞小さな島の呚りを衚しおいたす









たたは、このアンゎルンの地図のように、倧陞の半島









時々、マップは完党に土地たたはいく぀かの島倧陞で構成されたすが、それらはルヌルの䟋倖である可胜性が高くなりたす。



はじめに、「島」倧陞の䞖代を把握したしょう。 私のゲヌムで刀明したように、マップのサむズを考慮しおマップ䞊に倧きな䞭倮の島を生成する機胜が既にあったため、倧陞の䞻芁な圢状を生成するのに適しおいるはずです。 ノむズず远加の島々が残りを凊理したす。









この地図では倧きな䞭倮の海は予想しおいたせんでしたが、これは嬉しい驚きです。 別の䟋を次に瀺したす。









䞭倮の島の機胜の問題は、私が瀺した正方圢の地図には適しおいるが、長方圢の地図にはあたり良くない円で始たるこずです。 以䞋は、基本的なフォヌムがより明確に芋えるように、歪みが少ない䟋です。









これは、地図のサむズに応じお撮圱された、楕円圢の歪んだ円の代わりに寿叞をマスクするこずで簡単に修正できたす。









これらの䞭倮の島は地図を埋めるために拡倧瞮小されたすが、倧陞の地図の倚くの堎合、倧陞の呚りに「境界」を残す必芁がありたす。 2぀のパラメヌタヌは、X軞ずY軞に沿っお島を埋めるマップのサむズを制埡したす。









以䞋に、より論理的な歪みがある同じ境界管理システムを瀺したす。





地図の東郚ず西郚が海のたたであるこずがわかりたす。 別のりィンドりでマップを開いお、より泚意深く調べるこずができたす。これは、マップが党䞖界およびその右端ず巊端を接続できるたたは察応する端から海がある別のマップに接続できる䞖界の䞀郚を衚瀺するこずを意味したす。



前の地図を研究した熱心な読者は、海ず陞地のパタヌンが地図の䞭倮で止たっおいるこずに気づいたかもしれたせん。以前は、サむズが1x1のマップしかなかったため、海ず陞のパタヌンのサむズはこれらのマップに適合しおいたした。倧きなマップでは、マップ䞊にパタヌンを手動で䞊べる必芁があるため、この機胜を远加したした。 SVGにはパタヌンタむルを実行する方法がありたすが、Chromeにはバグが含たれおいるため、䜿甚できたせん。これは、自動的にタむル衚瀺されるより小さな陞ず海のパタヌンを䜿甚できるため、優れた機胜です。なぜ気付かなかったのか分かりたせん



それで、今では島の倧陞はうたく機胜しおいるので、「半島」倧陞の実装に移りたす-倧陞がその端から地図䞊に珟れる地図です。









この堎合、倧陞は3぀の端で厩壊するこずはできたせん。しかし、そのような地図の䞻な特城は、地図䞊に衚瀺されおいる倧陞ず地図倖の土地ずの間に重芁な土地接続があるこずです。



マップ倖でこのような接続を提䟛する最も簡単な方法は、生成䞭に䜎い海面を蚭定するこずです。そのため、マップに衚瀺される土地の面積を増やしたす。これにより、マップの端に沿っお土地が倧きくなり、海ではなく土地が出珟する可胜性が高くなりたす。









もちろん、これは土地の質量が非垞に興味深いこずを保蚌するものではなく、実際に統䞀されたす









単䞀の倧陞の類䌌性は、同じ䞖代の島倧陞を䜿甚しお䜜成できたすが、同時に島をマップの端に移動したす。次のようなものが埗られたす。









倧陞䞻には䞭倮の島であり、右䞊に移動しおいるこずがわかりたす。これは倧陞であり、厳密な島の圢状を維持する必芁がないため、圢状に歪みを远加できたす。









明らかに、救揎の生成には他にも倚くのアプロヌチがありたすが、少なくずもこの2぀は、倧陞芏暡で最も䞀般的な圢態の土地を生成する機䌚を䞎えおくれたす。



気配りのある読者は、倧陞の倚くの地図䞊にストラむプの圢で奇劙な圢の森林に気付くこずができたす。次回は、これらの奇劙な珟象を匕き起こす颚モデルずバむオヌムの問題に取り組み始めたす。



パヌト4.颚モデル



前述のように、ドラゎンズアバりンドマップ䞊の倧陞のサむズは、倩候ずバむオヌムの非珟実的なパタヌンを瀺し始めたした。この䟋では、森林が䞀般的な颚向に沿っお䞊んでいるこずがわかりたす。









理由は壊れたコヌドではありたせん。むしろ、倩気ずバむオヌムのモデルは単玔すぎお、倧芏暡にこれが明らかになりたす。これらの問題に察凊するために、颚モデルを改蚂するこずから始めたした。



私の颚モデルは、地球の颚の力孊をよりよく反映したいものです。ハドレヌ现胞、貿易颚などです。このようなダむナミクスは、倧陞の地図䞊の奇劙な気象パタヌンを取り陀くのに圹立ちたす。しかし、それらが远加されたずきに、ドラゎンズアバりンドの颚モデルに察する苊痛な䞍満が瀺されたした。 颚モデルの初期実装に぀いおは、こちらをご芧ください。。数日間これに぀いお考えた埌、私はゲヌムマップがボロノむ図ずしお衚瀺されるずいう事実に問題のほずんどが芁玄されるず決めたした。 むしろ、ボロノむ図のドロネヌ䞉角圢分割。地圢を生成する際に倚くの利点がありたす。ノむズず組み合わせお、自然に芋える陞地を䜜成できたす。それが救枈を生み出すために頻繁に䜿甚される理由です。ただし、個々の䞉角圢のサむズず向きは異なるため、隣接するセルを䜿甚する颚モデルなどの蚈算は非垞に耇雑になりたす。等間隔の同䞀゚リアのグリッドを介しお颚をモデリングする方がはるかに簡単です。さらに、颚モデルはほずんどの堎合、土地ほど詳现である必芁はありたせん。



しかし、ドラゎンズアバりンドの根底にあるボロノむ図を完党に攟棄したくありたせん。 少なくずも、これはプログラムのほが党䜓を曞き換える必芁がありたすその代わりに、マップを均䞀なグリッドにバむンドし、その䞭で颚モデルを実行しおから、逆バむンドを実行したいず思いたす。前埌にコピヌする際の損倱が倧きすぎない堎合、これにより颚モデルがより速く簡単になりたす。



どのグリッドを䜿甚する必芁がありたすか理想的には、グリッドは隣接するグリッドから等距離にある等しい面積で構成する必芁がありたす。そしお、この説明は六角圢のグリッドのようなものです。









実際、六角圢のグリッドは、平らな面を等しい面積に分割する最良の方法です。



次のステップは、プログラムで六角圢のグリッドをどのように衚珟するかを決定するこずです。手がかりを求めおネットワヌク䞊で少し怜玢するず、各リンクからアミットパテルの六角圢のグリッドに関するペヌゞに戻りたしたHabréでの翻蚳。おそらく、それから始める必芁がありたす。たた、ゲヌムメカニクスの実装に関する情報を探しおいる堎合は、最初にRed Blob Games Webサむトを探玢するこずをお勧めしたす。アミットは私よりもうたく説明しおいるので、䜕かはっきりしないこずがあれば、圌のペヌゞを読んでください。



最初に行うべき遞択は、六角圢のグリッドを保存する方法です。最も簡単な方法は、2次元配列ずしお保存するこずです。その埌、グリッドセルを配列にバむンドする機胜が必芁です。ここには倚くのオプションがありたすAmitのペヌゞを読んでくださいが、圌が奇数rず呌ぶものを䜿甚したす。









各セルの数倀は、2次元配列のセルのむンデックスです。画像はAmitのペヌゞから盗たれおいたす。圌のペヌゞではむンタラクティブなので、実隓しおみるこずをお勧めしたす。



遞択したら、六角圢のグリッドにむンデックスを付ける方法を孊ぶ必芁がありたす。たずえば、六角圢のセル3、3を探しおいる堎合、その近傍はどうなりたすか各セルの幅が5ピクセルの堎合、セルの䞭心の座暙3、3はどうなりたすかなどなど。これに察凊するのは難しい堎合があるので、Amitが私のためにそれをしおくれおうれしいです。



Amitから必芁なものをすべお盗むこずができるず仮定するず、たず、マップ䞊に六角圢を配眮する方法を理解する必芁がありたす。この段階では、配列はただ必芁ありたせん。配列のふりをしお、六角圢がどこにあるかを確認できたす。六角圢の䜍眮がわかっおいる堎合は、単にマップの幅をそれらの間の氎平距離で陀算しお列の数を取埗し、同じこずを垂盎に実行しお行の数を取埗し、各堎所に六角圢を描画したす









これらの六角圢は、颚モデルに䜿甚するものよりもはるかに倧きいですが、すべおが正しく配眮されおいるこずがわかりたす。



ここでは、マップの端を開き、䞭倮の六角圢ず境界のみを描画しお、マップ党䜓を本圓に閉じおいるかどうかを確認したした。









䞊郚ず䞋郚はマップの倖偎にありたすが、マップの䞀郚を芋逃さない限り、海倖のいく぀かのセルの存圚は重芁ではありたせん。



次のステップでは、六角圢のグリッドの配列を䜜成し、すべおのドロネヌ䞉角圢を察応する六角圢にスナップしたす。 Javascriptは負の配列むンデックスをサポヌトしおいないため、セル0、0をマップの䞭倮から右䞊隅に移動する必芁がありたす。これを行った埌、すべおのドロネヌ䞉角圢を䞀呚し、六角圢グリッドの察応するセルに远加したす。これを確認するには、土地を含む六角圢に色を付けたす。









セルが土地かどうかを刀断するために、このセルに入るすべおの堎所の高さを平均したす。䞀郚の沿岞六角圢では、土地がある堎合でも平均がれロ未満であるこずに気付くかもしれたせん。六角圢のすべおの堎所の最倧高さを䜿甚するこずもできたす。









この堎合、怜玢は反察方向に行われたす-六角圢に土地がある堎合、その六角圢は土地ずしおマヌクされたす。どちらが良いかは、必芁なものに䟝存したす。



いずれにしおも、六角圢のサむズを小さくするこずで粟床を䞊げるこずができたす。









海岞ははるかに良くなったが、新たな問題が生じた-土地ずはみなされない倚くの内郚六角圢。これは、六角圢が十分に小さくなるず、六角圢の䞭にはドロヌネ䞉角圢がたったくないために起こりたす。したがっお、それらには「高さ」はありたせん。 これは、ドロヌネ䞉角圢の䞍均䞀性も瀺しおいたす。



この解決策を䜿甚できたす-䞍足しおいる䞉角圢の高さを、隣接の平均ずしお、たたは隣接の最倧ずしお取埗したす。









䞀般に、六角圢ず堎所の間の結合が1察1でない堎合、䞍足しおいる情報を埋めるために修正が必芁です。



マップ䞊に六角圢のグリッドを配眮したので、颚モデルの実装を開始できたす。颚モデルの䞻なアむデアは、いく぀かの颚貿易颚をシミュレヌトし、それらが䞍動状態に達するたでマップ党䜓に分垃させるこずです。六角圢のレベルたたはドロヌネ䞉角圢で行う堎合は堎所のレベルには、2぀の段階が含たれたす1珟圚の六角圢に入るすべおの颚を芁玄し、2合蚈された颚が六角圢から出る方法を決定したす。



最初の段階は非垞に簡単です。各六角圢には6぀の隣接があり、これらの各六角圢が寄䞎しおいたす。六角圢に入る各颚をベクトルず考えるず、セル内の颚の合蚈はこれらのベクトルの合蚈になりたす。同じ力の厳密に反察の2぀の颚は互いに無効にしたす。



2番目の段階総颚がどのように六角圢から出るかを決定するは、考える必芁がありたす。最も単玔なケヌスは、六角圢を盎接通る颚です









この堎合、颚は倉化せずに次のセルに移動するこずが予想されたす。ここで、赀いベクトルは゜ヌス颚であり、青いベクトルは䌝播する颚のベクトルです。



しかし、颚が隣接するセルに盎接吹かない堎合はどうでしょうか。









この堎合、颚の䞀郚はその盎䞊の六角圢に吹き蟌み、他の郚分はこれから反時蚈回りに䜍眮するセルに吹き蟌み、比率は矢印が指す方向に䟝存する必芁があるず考えられたす。この堎合、颚の䞻芁郚分は䞊郚のセルに移動し、隣接するセルには移動したせん。



たた、颚の広がりの方向を決定する必芁がありたす。1぀のオプションは、元の颚の方向を維持するこずです。









これが最も珟実的なオプションのようですが、別のオプションがありたす-亀差する六角圢の゚ッゞに埓っお颚の方向を倉える









このアプロヌチの粟床は劣りたすが、利点がありたす。入っおくる颚は垞に6方向のいずれかであるため、蚈算が簡単になりたす。



地圢を考慮するず、別の困難が生じたす。山が颚に吹かれたらどうなりたすか









この堎合、颚の䞀郚は山の䞊を通過したすが降氎を匕き起こす可胜性がありたす、颚の䞀郚は偎面に向きを倉えたす。









したがっお、颚が六角圢からどのように出るかは、その方向ず、隣接するセルの緩和に䟝存したす。



次に、ベクトルの衚珟方法に぀いお説明したす。䞻に2぀のオプションがありたす。たず、ベクトルはX倀ずY倀ずしお衚すこずができたす。たずえば、次のようになりたす。









0、0から始たるベクトルを描く堎合、X、Yは終点の座暙です。このようなレコヌドにより、ベクトルの合蚈が非垞に簡単になりたす。すべおの倀X、Yを合蚈しお、新しいベクトルを取埗したす。









別のオプションは、ベクトルの角床ず長さを䜿甚するこずです









この圢匏では、ベクトルの回転や長さの倉曎などの操䜜を簡単に実行できたす。

颚モデルで必芁ずされるほずんどの操䜜では、最初のオプションの方が優れおいたすが、堎合によっおは2番目のオプションの方が優れおいるため、必芁に応じお切り替えおおくず䟿利です。車茪を再発明しないために、Javascriptのベクタヌラむブラリを探し、Victor.jsが完党に登堎したので、それを利甚したした。



たず、各六角圢に颚のベクトルを远加し、芖芚化できるかどうかを確認したす。









これたでのずころよさそうだ。



次のステップは、颚ベクトルを正しく分割しお次のセルに分配できるかどうかを確認するこずです。最初に、他のセルに぀ながる角床を蚈算する必芁がありたす。私はアミットのペヌゞで再び答えを芋぀けたした









぀たり、0床のベクトルは右の六角圢を指し、60床のベクトルは右䞋の六角圢を指したす。これらの2぀の方向を指すベクトルは、2぀のセルに比䟋しお分割されたす。぀たり、30床の角床のベクトルは、右のセルず䞋から右のセルに均等に分割されたす。各ベクトルは、2぀の隣接するセルの面の角の間のどこかにあるため、颚のベクトルの角床を芋お、2぀の六角圢の䞭倮の角の間にあるこずを確認し、これらの2぀の六角圢の間で比䟋的に分割したす。



たずえば、颚のベクトルの角床が22床の堎合









次に、倀の38/60が右偎のセルに䌝播し、ベクトル倀の22/60が右䞋のセルに䌝播したす。ベクトルがXずYの倀のペアずしお衚瀺される堎合、元のベクトルの各倀に分数たずえば、22/60を掛けおから、新しい六角圢の颚ベクトルに远加するこずにより、それらを分配できたす。



これをテストするために、颚をさたざたな方向に配眮し、それらをマップの䞊郚ず偎面に配眮しお、それらがマップ䞊で正しく広がるかどうかを確認したす。颚が衝突する堎合、それらを組み合わせお、速床を䞊げお平均的な方向を遞択する必芁がありたす。









ここでは、颚が察角線に沿っお集たり、結合しお䞋隅に向かっお吹くこずがわかりたす。



次のステップは、颚に察する土地の圱響を考慮するこずです。もちろん、実際の颚のモデルは非垞に耇雑ですが、私は䞻に土地の地理が地衚颚にどのように圱響するかに興味がありたす。最も単玔なレベルでは、これは颚の方向ず速床に察する土地の高さず䜎地の圱響です。私は倚くの異なるアプロヌチを詊したしたが、その結果、2぀の簡単なルヌルに萜ち着きたした。



  1. 颚は障害物から遠ざかる。
  2. 颚は䞊昇するず枛速し、加速しお䞋降したす。


障害物は、高さが高いセル、たずえば山のあるセルに颚が吹くず発生したす。この堎合、颚が吹く2぀のセルを芋お、颚の角床を倉曎しお、2぀の六角圢の䜎い方を指すようにしたす。角床の倉化の倧きさは2぀のセルの高さの違いに䟝存するため、颚が山のある2぀の隣接するセルに吹き蟌むずき、その方向はほずんど倉化したせんが、山のあるセルず平野のあるセルに吹き蟌むず、空のセルに向かっおより倚くなりたす









颚の匷さを調敎できたす。䞊蚘のマップでは、圌は匷すぎお、倚くの非珟実的なバむオヌムの出珟に぀ながりたす。より論理的な意味は次のずおりです。









起䌏によっお匕き起こされる颚の動きの倧郚分は䟝然ずしお残っおいたすが、匷颚の倧きな隙間ず谷は小さくなっおいたす。



リアリズムを匷化する別の機胜は、颚の分散です。たずえば、䞊の地図は、ブリヌチの街の真䞊で颚が西に吹いおいるこずを瀺しおいたす。長い距離を吹き飛ばしたすが、予想どおりに消散するこずはありたせん。吹いおいる颚が別の空気ず出䌚うず、通垞は颚も䞀緒に匕っ匵りたす。これをシミュレヌトするために、各六角圢に吹く颚の小さな郚分を取り、それをすべおの隣接するセルに再分配できたす。䞊蚘の小さな散垃図のマップは次のようになりたす。









ご芧のずおり、Breechesの颚がやや消散し始めおいたす。



この操䜜により、颚向の倧郚分が決たりたす。 2番目の郚分は、䞊昇時の颚の枛速ず䞋降時の加速です。これは、颚が来るセルの盞察的な高さず、颚が吹くセルの高さを芋お、必芁に応じお加速/枛速するこずで実珟できたす。



すべおの倖芳は次のずおりです。









島の䞭倮郚の高い山々を吹き抜ける颚の䞀郚が遮断されたこずがわかりたす。そしおその逆-いく぀かの新しい颚が島の西郚に珟れ、そこで空気は比范的高い土地から海に移動したす。 これは沿岞の埮颚です実際にはそうではありたせんが、メカニズムはそこでは異なりたす。



これで、既存の降氎アルゎリズムに新しい颚を代入できたす。以䞋に比范を瀺したす巊偎に叀い颚、右偎に新しい颚





画像をクリックするず、拡倧版が衚瀺されたす。明らかに、颚のモデルには違いがありたす。䞡方のマップで、颚は東から吹いおいたす。地図の䞭倮付近の山々は颚を南に向け、倧雚を匕き起こし、山の南に沌地ず森林を䜜りたす。䞋郚では、干枉なしに颚が吹き、島の東半分に沿っお森林が圢成されたす。元の颚モデルでは、島の西郚に森を䜜るのに十分な颚が䞭倮の山ず沌地を通過したした。新しいモデルでは、颚のほずんどが遮断され、草が茂ったバむオヌムが山の向こう偎に圢成されたす。



叀いモデルには、ランダムパラメヌタヌの倉動性䞀定の間隔内があり、これらのパラメヌタヌのいく぀かの組み合わせにより、新しいマップのような写真が埗られる可胜性がありたす。しかし、実際には、叀いモデルの正確な動䜜を再珟する必芁はありたせん。説埗力のある結果を䜜成するモデルだけです。



このすべおのポむントは、新しい颚の振る舞いを倧陞の地図に远加できるように、颚の生成を加速しお単玔化するこずです。したしたか元の颚モデルず新しい六角圢ベヌスのモデルのプロファむルを䜜成したした。新しいモデルは、元のモデルよりも15〜20倍高速であるこずが刀明したした。これは非垞に重芁な加速であり、カヌドにはほずんど圱響したせん。この実隓は、モデルが六角圢のサむズに特に敏感ではないこずを明らかにしおいるため、必芁に応じお、セルのサむズを倧きくするこずでアルゎリズムをさらに高速化できたす。



次回は、新しい颚モデルを䜿甚しお倧陞芏暡の颚パタヌンを実装し、それらを降氎モデルずバむオヌムに接続する䜜業に取り組みたす。



All Articles