現在私はタイルベースのゲームの独自のテイクに取り組んでいます(Terrariaを考えてくださいが、空想的ではありません(それは言葉だと思いますか?そうでない場合は申し訳ありません))。
とにかく、私は現在、衝突検出が機能しています(コーナーケースの場合でも!)。これは私にとって大きな一歩でした。スプライトがブロックを通過しないのを見るのは非常にうれしいことです。しかし、それから私はベンチマークするという考えを持っていました。悪いアイデア。
1,000平方、問題ありません。10,000の正方形、3つの文字は少し遅れました。3文字で100,000の正方形(本当に巨大な地図)はプレイできませんでした。
プレイヤー、キャラクター、アイテムなどから遠すぎるブロックも考慮したくないという問題がありますが、それらを常にメモリからロードしたくありません。
ここまでが私のアルゴリズムです。自由に非難してください。
foreach (Block in level)
{
if (distance from block to player > a specified amount)
ignore this block;
else
{
get the intersection depth between the two bounding boxes
if (depth of intersection != Zero-vector)
{
check y size vs x size
resolve on smallest axis
}
}
}
お気づきのように、レベルサイズが大きくなると、このアルゴリズムの次数はNブロック増加します。プレイヤーの近くにもないブロックも考慮しません。
リストの代わりに(0,0)から(mapWidth、mapHeight)までのブロックの二重配列を使用して、人の位置に応じて危険ゾーンを計算することを考えています(たとえば、プレーヤーの位置が(10、20)にある場合) (0、10)から(20、30)のようになります。
どんな考えや配慮も素晴らしいです、ありがとう。