1

名前を保持し、次を使用して適切なグラフィックを表示する配列があります。

public void paintComponent(Graphics g){

for(int i = 0; i<20; i++)
{
    for(int j = 0; j<20; j++)
    {   
        if(testMap.getData(i+(rowX-7), j+(columnY-7)).indexOf("rock") >= 0)
        {
            g.drawImage(image3, j*50 + 5*add, i*50 + 5*add2, 50, 50, this); 
        }   
    }
}

これは、私のゲームの実際のグラフィックスをうまく表示します。ただし、私のミニマップでは、for ループの 'i' と 'j' で異なる値と増加した数値を使用して、同じことを行います。これにより、より大きな範囲でマップのより小さなバージョンが作成され、これが残ります。(注: drawImage() メソッドの 1 つだけを含めました。コードを読みやすくするために、ここでは残りを削除しました):

私のRPGゲーム

これは私が望んでいた効果とほぼ同じですが (簡単に変更できる配置は別として)、これは既に画面に表示されているものを小さくしたものにすぎません。ただし、約 20 x20 を超えると、ゲームが大幅に遅れ始めます。おそらく、コードのひどい方法と関係があります。

fillRect を使用して画像を正方形に置き換えてみましたが、問題は解決しません。

誰かが見たい場合は、これが私のメインクラスのコードです: http://pastebin.com/eEQWs2DS

paintComponent メソッド内の for ループは 3160 行目あたりから始まり、メイン ディスプレイのループは 2678 行目あたりから始まります。Jframe を 1260 行目あたりに設定しました。

以上のことから、基本的に私の質問は次のとおりです。

ミニマップを作成するためのより効率的な方法はありますか? 私の考えは、フレームが更新されるたびにゲームが再計算する必要がないように、プログラムの開始時に画像を生成することでした。事前にマップを作成することもできますが、マップを変更するたびに手動で更新する必要があり、これは非常に面倒です。前者の方法を調べるのに苦労しています。私の他のアイデアは、ミニマップのみのリフレッシュ レートを遅くすることですが、その方法もわかりません。

それ以外に、ラグの問題に対する簡単な修正があれば教えてください。非常に厄介なコードで申し訳ありません - ディスプレイを使って何かをプログラミングするのはこれが初めてなので、うまくいくまでハッキングしました。

4

2 に答える 2

1

あなたの実装でこれがどれほど簡単かはわかりませんが、画像を描画する代わりに、タイルの種類に基づいて特定の色の正方形を描画できますか?

たとえば、タイルのリストをループして草のタイルを見つけた場合、最初に草のタイルを適切な位置に描画し、次にミニマップに小さな緑色の正方形を描画します。

これの欠点は、最初にタイルに使用する色を定義する必要があるか、タイルをロードするときに各タイルの平均色を計算してから、それを使用することができることです。もう 1 つの問題は、タイルの詳細がはるかに多いため、家がミニマップにうまく反映されない可能性があることです。ただし、実際に家のタイルを描画する代わりに、ミニマップにある種の家のアイコンを描画することもできます。

基本的に、ミニマップ上のマップ内のオブジェクトのより単純な表現を使用したいと考えています。

于 2013-02-13T01:12:14.630 に答える
0

私が Tyrant (Java ローグライク) でそれを行う方法を見てみましょう:

重要なトリック:

  • オフスクリーンを使用しBufferedImageます。これをキャッシュして、ペイントするたびに再作成しないようにします。
  • 配列を使用int[]して各タイルに単一の色を設定します
  • 配列で setRGB を使用して、すべてのマップを一度に描画します
  • ミニマップを x2 ズームで描画して、タイルごとに 2x2 ピクセル ブロックを取得します。

さらに効率的にしたい場合は、changedフラグを保持し、ミニマップに表示される何かが変更されたときにのみミニマップ BufferedImage を更新します。上記はすでに非常に効率的であるため、それだけの価値があるとは思いませんでしたが、YMMV.

于 2013-02-13T02:24:30.967 に答える