0

の2D配列からマップをchar読み込んでいるので、100ブロック(10x10の領域)を超えると、ゲームは非常に遅くなります。すでにキャラクターの特定の距離内でのみブロックをレンダリングしています。また、実行速度が非常に遅い理由はわかっていると思いますが、修正方法がわかりません。コードは次のとおりです。

public void renderBlocks(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics 2D)g;
    for(int x = 0; x < 50; x++) {
        for(int y = 0; y < 50; y++) {
            //blocks[x][y] tells it which type of block to load
            Block next = new Block(blocks[x][y], x, y); 

            if((next.getX() - player.getX()) >= (-13*32) && 
            (next.getX() - player.getX()) <= (13*32)) {

                if((next.getY() - player.getY()) >= (-6*32) && 
                (next.getY() - player.getY()) <= (6*32)) {

                     g2d.drawImage(next.getImage(), (next.getX() - player.getX()),    
                      (next.getY() - player.getY()), this);
                }
            }
         }
     }
 }

この線:

Block next = new Block(blocks[x][y], x, y);

それが本当に遅くなる原因です。それらを画面に描画していなくても、のすべての要素に対してBlock next等しい設定になっています。問題は、ブロックを描画するために文字からどれだけ離れているかを決定するため、このコード行を削除できないことです。次に、画面に描画されているblocks[x][y]の要素と同じ数だけ設定されるようにする必要があります。new Block(blocks[x][y], x, y)blocks[x][y]

私は入れてみました:

if((x - player.getX()) >= (-13*32) && (x - player.getX()) <= (13*32)){
    Block next = new Block(blocks[x][y], x, y);
    ...Rest of Code here
}

その周りと同じですy - playerYが、理論的には機能するはずですが、機能しません。

これを行う方法を知っていて、ArrayListからブロックをロードしたときと同じくらい速くゲームを実行する方法を知っている場合は、この質問に答えてください。これにより、5000を超えるブロックをロードでき、良好なFPSレートで実行できます。この問題を解決するためにゲームのソースコードが必要な場合は、必要だとコメントしてください。投稿します。

4

1 に答える 1

1

プレーヤーを囲むタイル上でのみループを作成できます。

super.paint(g);
Graphics2D g2d = (Graphics 2D)g;

// find the block with the player (might need correction)
int playerX = (int) (player.getX() / 32);
int playerY = (int) (player.getY() / 32);

int viewDist = 6;

int lowerX = Math.max(playerX - viewDist, 0);
int upperX = Math.min(playerX + viewDist + 1, 50);
int lowerY = Math.max(playerY - viewDist, 0);
int upperY = Math.min(playerY + viewDist +  1, 50);

for (int x = lowerX; x < upperX; x++)
{
    for (int y = lowerY; y < upperY; y++)
    {
        Block next = new Block(blocks[x][y], x, y);
        g2d.drawImage(next.getImage(), (next.getX() - player.getX()),    
                      (next.getY() - player.getY()), this);
    }
}
于 2012-02-18T02:04:25.093 に答える