0

私は Minecraft をプレイするときに使用するプログラムを作成しています。これは床をシミュレートするグリッドであり、障害物とライトを点線で表示し、どの「ブロック」が十分な量の光を得るかを計算できるようにすることです。プランニングツールなので、フロアの全体像をつかみ、十分な稲妻できれいなものを作ります。

障害物と光をドットで塗りつぶして正しい広がりを作成することはできますが、私の問題はこのプログラムで解決したかった問題の性質にあります。多くのことを台無しにし、すべてをやり直さなければならないので、光を削除できるようにしたいですそしてもちろん、光が放つ光も。

ライトをドット アウトするときのライト計算のコード。

public void changeLightUp(int light)
    {           
        //no light left, return
        if(light == 0)
            return;

        //not a source or block, change light
        if(type == 0)
        {
            //light is greater, return
            if(lightLevel >= light)             
                return;
            lightLevel = light;
        }
        //solid block, ignore
        else if(type == 1)
            return;

        if(xCoord != main.gridSizeX - 1)
            main.grid[xCoord + 1][yCoord].changeLightUp(light-1);
        if(xCoord > 0)
            main.grid[xCoord - 1][yCoord].changeLightUp(light-1);
        if(yCoord != main.gridSizeY - 1)            
            main.grid[xCoord][yCoord + 1].changeLightUp(light-1);
        if(yCoord > 0)              
            main.grid[xCoord][yCoord - 1].changeLightUp(light-1);
    }

つまり、これが何をするか: ライトが残っているかどうかを確認し (メソッドは再帰的であるため、ライトを次のブロックに送り、マイナス 1 を計算します)、新しいライトがある限り、それが「床」ブロックかどうかを確認します。より大きい - 更新。障害物でない場合は、すべてが完了するまで、隣接する 4 つのブロックに光 (マイナス 1) を送信します。

これを「後方」に行う良い方法は思いつきません。これはこの種の最初の問題ではないので、答えはそこにあると確信しています! ただし、何を検索すればよいかわかりません。答えがネット中に散らばっていたらごめんなさい:)

編集:実際の問題について十分に明確ではないようでした。グリッドは「ブロック」で構成され、各ブロックには独自のライトレベルがあります。ソースがグリッドに追加されると、その光源は隣接する光源に「放射」されます。これは、コード スニペットで確認できる再帰的な方法によって行われます。問題は、ブロックを削除するときに、正しい方法でライトを削除する方法がわからなかったことです。ソースによって「ヒット」されたブロックを単純に計算するのは簡単ですが、それは取り込まれませんでした。近くに他のソースが存在する可能性があるため、すべてを0に設定すると光レベルが間違っている可能性があることを説明してください。問題が解決したことを願っています。私の質問に答えてくれたすべての素晴らしい人々に感謝します<3

4

1 に答える 1

1

2つの解決策があると思います:

  • lightSourceIdブロック クラスに属性を追加できます。このようにして、オフにしたばかりの光源によって照らされているすべてのブロックを見つけることができます
  • 光源を変更 (追加/削除/移動) するたびに、すべてのグリッドを再計算できます。
于 2012-08-27T13:06:49.153 に答える