2017-06-10 32 views
0

私は、プレイヤーの周りに徐々に照明を使いたい、テラリアを考えると、Javaのタイルベースの掘り出し物ゲームに取り組んでいます。私は現在、その四角形のアルファが私が持っている明るさ(0.01 =黒、1 =明るい)である矩形でイメージをオーバーラップさせています。これは問題なく動作します。それは私が助けが必要な照明をどのように設定するかではなく、コンパクトで効率的なアルゴリズムを書いて、ブロックがプレイヤーに近いほど大きな数字になり、ブロックがプレイヤーから離れているほど小さくなります。番号は1〜0.01の範囲内にある必要があります。 Iは、プレイヤが移動する次の方法毎回呼び出す:タイルベースのゲームでプレイヤーの周りを照らす

public void calculateBlockBrightness(int playerInRow, int playerInCol) { 

    int affectedBlocks = 5; 
    float brightness; 

    // Loops through all blocks within (affectedBlocks) blocks of the player 
    for (int row = playerInRow - affectedBlocks; row <= playerInRow + affectedBlocks; row++) { 
     for (int col = playerInCol - affectedBlocks; col <= playerInCol + affectedBlocks; col++) { 

      // Not all blocks should be affected by this method 
      if (blockNotRelevantForBrightness(row, col)) 
       continue; 

      // If the block is within (affectedBlocks - 1) blocks of the player 
      if (row >= playerInRow - (affectedBlocks - 1) && row <= playerInRow + (affectedBlocks - 1) 
        && col >= playerInCol - (affectedBlocks - 1) && col <= playerInCol + (affectedBlocks - 1)) { 

       /* 
       * Algorithm 
       */ 

       blocks[row][col].setBrightnessPercentage(brightness); 

      // Reset the "outer layer" blocks to default brightness. 
      } else { 
       blocks[row][col].setBrightnessPercentage(blocks[row][col].getBrightnessDefault()); 

      } 
     } 
    } 
} 
+0

ブロックはプレーヤーからどのくらい離れていますか?また、プレイヤーがタイルの上にいるときに、それが最も明るくなるようにしたいと思いますか? –

+0

また、タイルがどれだけ速く/遅く消えるかによって異なります。リニアフェードが欲しいのですか、あるいは別のフェードスキームが必要ですか? – pacifier21

+0

four_lines:私は現在100x100のタイルを持っていますが、5-10の最も近いブロックだけが影響を受けていればいいと思います。そして、はい、それはプレーヤーがタイルの上にいるときに最も明るいはずです。 – SunkenSwe

答えて

0

このようなケースでは、多くの場合、二段階で所望の値を計算することが有益である:

  1. は、範囲内の補間値を計算します[最小値と最大値との間の0 ... 1]
  2. 補間、補間値

に基づいて、ここで、補間値があります"relative"距離であり、最小輝度と最大輝度との間の補間に使用される。

2つのタイルの間の距離は

sqrt(rowDifference² + columnDifference²) 

(これは便利な方法によって、Math#hypotを使用して計算することができる)として計算することができます。

影響を受けるタイルが水平方向および垂直方向にプレーヤーのタイルに与える可能性のある最大距離は、(affectedBlocks - 1)です。タイルのペア、すなわちタイル(row, col)(playerInRow, playerInCol)の場合、これらのタイルの間の距離を計算し、最大距離で除算して[0,1]の値として相対距離を取得することができます。この値は、適切な輝度を計算するために使用できます。

private float computeBrightness(
    int row, int col, int playerRow, int playerCol, int affectedBlocks) 
{ 
    // Compute the distance of the tile (row, col) to the player tile 
    double distance = Math.hypot(row - playerRow, col - playerCol); 

    // Compute the maximum possible distance of a tile 
    double maxDistance = Math.hypot(affectedBlocks - 1, affectedBlocks -1); 

    // Compute the relative distance, as a value in [0,1] 
    double relative = distance/maxDistance; 

    // Compute the brightness for the relative distance 
    double minBrightness = 0.01; 
    double maxBrightness = 1.0; 
    double brightness = 
     maxBrightness - relative * (maxBrightness - minBrightness); 

    System.out.println(
     "For " + row + " " + col + " brightness is " + brightness); 

    return (float)brightness; 
} 

サイドノート:affectedBlocksが一定であると仮定すると、最大距離も一定となり、そして例えば、一定値フィールドとして格納することができます

private static final int AFFECTED_BLOCKS = 5; 
private static final double MAX_DISTANCE = 
    Math.hypot(AFFECTED_BLOCKS - 1, AFFECTED_BLOCKS - 1); 
+0

Marco13ありがとうございます。これはかなりうまくいきます。私は数学やプログラミングに関してはそれほど偉大ではないので、私はあなたの解を完全に理解していません。私はそれを調整しようとしました(主に最小輝度と最大輝度の変数を使用しています)が、影響を受けるブロックが影響を受けない "ハードエッジ"を得ています。あなたのメソッドを追加し、minBrightnessを0.00に変更しました。 maxBrightnessを0.5に設定します。これらの "ハードエッジ"を得られない方法はありますか?ここにゲームの写真がいくつかあります。最初のものはあなたの方法の影響を受けており、2番目のものはあまりありません。 https://ibb.co/fnHuha https:// ibb。co/gJiH2a – SunkenSwe

+0

何が間違っているのかをイメージから推測するのは難しいです。あなたが 'System.out.println'文から結果を提供した場合(それには' distance'と 'relative'を表示することもできます)に役立ちます。それはたくさんのテキストかもしれないので、pastebinのようなものに投稿することが望ましいでしょう(実際に他のオプションがない場合は、あなたの質問に出力の抜粋を投稿することができます)。 – Marco13

関連する問題