タイル2Dゲームのライティングアルゴリズムにおける合計計算の手法

こんにちは 私の最後のゲームはアイソメトリックウォーカーで、その特徴の1つは領土の「探索」です。最初はマップは黒で、プレイヤーはゲーム中にこの「戦争の霧」を開きます。 さらに、タイルの可視性は、キャラクターまでの距離だけでなく、環境にも依存します。不透明な壁の背後にあるセルは、真っ白に近づいても見えませんが、たとえば、茂みがあると、背後のセルの可視性が50%低下します。



画像



プロセッサにフレーム単位のレイトレーシング(現在どのセルが「見える」かを判断する)に負担をかけないようにするため、「合計計算」というかなり興味深い方法を使用しました。正しい値を選択して、彼女に連絡してください。



予備計算とはどういう意味ですか:



ヒーローは原点のセルに配置されます(0; 0)。 画面の可視性内(2画面内にマージンがある)の各セルについて、セグメントが原点から中心まで交差するセルのリストなど、さまざまなゲームパラメータが考慮されます。



画像



より正確に言うと、このようなリストは各セルの4つのコーナーごとに考慮されます。



画像



これらのデータはすべて「可視性マトリックス」Mに記録されます。



どのように機能しますか? ゲーム内の各オブジェクトには、「不透明度」パラメーターがあります-0〜1の値で、レビューを妨害する割合です。 ゲームで、タイル(xt; yt)がヒーローの位置(x0; y0)に対してどの程度見えるかを調べるには、次のものが必要です。



1.行列要素Mt = M [xt-x0; yt-y0]を参照してください

2.このタイルの各角がどれだけ見えるか計算する(さらに、タイル自体によってブロックされる角度(xt; yt)は考慮されないため、2つまたは3つあります):その中にあるすべてのオブジェクトの「可視度」を乗算します(そして、はい、可視性がゼロのオブジェクトが見つかるとすぐに、リストを歩き続けることはできません)。

3.タイルの可視性程度Vt =各角度の可視性の算術平均。



だから私は、何かが変わったときにヒーローの周りの特定のエリアの各タイルに対して行います(ヒーローまたはオブジェクトの位置)。



いくつかの不透明な壁がセルの端でわずかにブロックされている場合、アーティファクトを滑らかにするために、タイルの中心の代わりにコーナー計算が実行されますが、これによりセルは完全に見えなくなります。



画像



ご存知のように、この方法は完全に正確ではありません(正直な「アナログ」レイトレーシングと比較して)、良い値を提供します。 ゲーム内のセルが視覚的に少ないほど、離散性が顕著になります。



パフォーマンスが「可視性マトリックス」内のすべてのパラメーターの予備計算をどれだけ増やすか(移動中のパラメーターの決定と比較して)は、言語に依存しますが、実際には、すべての幾何学的計算はマトリックス/ベクトル要素にアクセスする操作に置き換えられます。 AIRの場合、速度の増加は7倍から11倍に変化します(マップエリアのオブジェクトのロードの程度によって異なります)



一部のオブジェクトが光を発し、一部のオブジェクトが光をブロックできる場合、同じマトリックスを使用してセルの照明を決定できます。 ここでのアルゴリズムはまったく同じです。



画像

(コインにはわずかな輝きがあります)



ダイナミクスでタイルの可視性を変更するデモ:







ご清聴ありがとうございました!



All Articles