2012-03-25 7 views
5

私はXNA 2Dタイルベースのゲームに照明を追加しています。2Dタイル照明

私はthis記事が役に立ちましたが、そのやり方は衝突をサポートしていないことがわかりました。私がしたいことは、次の

  • は常にポイント
  • 衝突を(光線がブロックに当たった場合は、影をシミュレートするために、その暗いまでどんな量で次のブロックをdim)は点灯しなければならないのための方法であり、

私はかなりしばらくの間、周りに検索してきたが、運が(私はカタリンのチュートリアルを見つけなかったが、少しは私のために進んで見えた、と原因のためにゲーム全体を再描画するだけでなく、タイルには適用されませんでした各点)

答えて

1

私は、スムーズな照明効果を2Dタイルグリッドに適用する方法を共有します。 ClassicThunderのanswerは、シャドウのための素晴らしいリンクを提供します。

まず、各タイルの照明値を計算し、後でぼかしていく必要があります。私がコードに入る前に、これがどのように機能するかを説明しましょう。

Lighting

Basicly、私たちがやることは、我々は固体のタイルを見つけた場合、としてそれを設定し、タイルが空白の場合、最大輝度にCurrentLight変数を設定し、上から順に、すべてのタイルをループでありますCurrentLight変数を使用し、CurrentLightから「吸収」量を減算します。このように、次の実線のタイルでは、タイルをCurrentLightの値に設定すると、わずかに少なくなります。このプロセスは、配列が反復されるまで繰り返されます。

ここで、上から下の照明効果が上手くいくでしょうが、それほど優れていません。このプロセスをさらに3回、下から上、左から右、右から左へ繰り返す必要があります。そしてそれはより良い品質のために何度も繰り返すことができます。

は基本的に

if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light 
    CurrentLightR = tile.Light; 
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light 
    tile.Light = CurLightR; 
if (tile.Light == CurLightR) //If it is the same, subtract absorb values 
    CurrentLight -= tile.Absorb; 

そして、そこに行くループ内のすべてのタイル、素敵なタイルの照明にこのコードを実行しています。しかし、あまり「ピクセル化」されていないようにするには、question on gamedevをチェックしてください。

0

ピクセル単位の照明については、私はそれについて知らないので、どこか別のものを見ること。 SpriteBatch.drawの

の場合、いくつかのオーバーロードされたメソッドには色が付きます。 Color.Whiteを使用すると、SpriteBatchが描画するスプライトは通常の色です。

基本的に新しい色を作成することによって

使用色の乗算(Color.yourcolor.r *フロート、Color.yourcolor.y *フロート、Color.yourcolor.z *フロート、255)

、フロートを取得します近くのライト(おそらく配列やリストに格納されている)に起因するブロックの明るさを計算する式を見つけようとします。 2Dゲームに必要な法線はないので、この式は比較的簡単になるはずです。

+0

-1 4。デフォルトの動作(Color * float)の下で0を指定すると、明度/暗さが変更されず透明度が変更されます。 http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4-0.aspx – ClassicThunder

+0

@ClassicThunderの周りには何か方法がありますか? – Neomex

4

Catalin's excellent lighting tutorialをご覧ください。私はそれがあなたのすべての要件を満たすと信じています。

+0

のように聞こえる "(私はCatalinのチュートリアルを見つけたが、それは私のために高度に見えたようだ)"うーん...私は病気はそれを見てanouserを取ると思います – Cyral

+0

おっとすみません。しかし、私はライティングが非常に高度なトピックであることを恐れているので、それを行う方法を教え、従うのは簡単なチュートリアルを見つけるのは難しいでしょう。 – ClassicThunder

+0

本当に、私はチュートリアルで作業していましたが、私はライトポイントを使用していましたが、シャドーを動作させるためにDrawTiles()を呼び出す場所を少し混乱させました。基本的に私はタイル[、]配列を持っていますが、カタルーニャが単一の画像で行う方法でそれを侵すようです。 – Cyral