2011-12-31 7 views
1

まず、幸せな新年。Javaで地図をスクロールする方法は?

アイブ

int[] map = new int[2550]; 

例えば地図における左上のブロック一つ

map[0] = 1 
のIDを持っている場合にその配列に私は、そのPOSのブロックのIDを置くを得

私はそうのようなマップをレンダリングするよう今私は、私は今、私の地図をスクロールする方法を考えるようにしようとしている -

for(int y = 0 ;y < current.height;y++){ 
for(int x = 0 ; x < current.width;x++){ 
    Block block = current.getBlock(x, y); 
    g.drawImage(block.texture, x * 30 , y * 30); 
    } 
} 

どうでしょう私は地図をスクロールしますか?例えば0,0にあったブロックが0,1になったとします。助けてくれてありがとう。

編集:LWJGLとslick2dを使ってレンダリングや処理をしているので、SwingやAWTを使うことはできません。

答えて

1

スクロールでは、すべてのグラフィックを可変オフセットで描画しています。現在のスクロール位置が存在するようにしてください。スクロールしたいときはいつでも、これらの変数を更新して再描画してください。描画ルーチンで、ループを次のように変更します。

for (int y = 0; y < current.height; y++) { 
    for (int x = 0; x < current.width; x++) { 
    Block block = current.getBlock(x, y); 
    g.drawImage(block.texture, x * 30 - scrollX, y * 30 - scrollY); 
    } 
} 

これは基本的なスクロールであり、これで動作します。しかし、スクロールを追加している場合、おそらく画面よりもはるかに大きな地図を用意する予定です。その場合、マップ全体を毎回描画するのは非効率的です。

int startX = Math.max(scrollX/30, 0); 
int startY = Math.max(scrollY/30, 0); 
int limitX = Math.min((scrollX + windowWidth)/30 + 1, current.width); 
int limitY = Math.min((scrollX + windowHeight)/30 + 1, current.height); 
for (int y = startY; y < limitY; y++) { 
    for (int x = startX; x < limitX; x++) { 
    Block block = current.getBlock(x, y); 
    g.drawImage(block.texture, x * 30 - scrollX, y * 30 - scrollY); 
    } 
} 

minmaxが境界外のタイルを描画しようとしないようになっている。そのため、代わりにマップ全体を反復処理のため、あなたはあまりにも複雑ではありませんマップ、ののみ見え部分を反復処理します地図のループの境界が変更されていることを除いて、これはまったく同じループです。

ちなみに、タイルのサイズを変えたりズームを追加したりする場合は、場所を問わずコードを変更する必要はありません。

static final int TILE_SIZE = 30; 
... 
g.drawImage(block.texture, x * TILE_SIZE - scrollX, y * TILE_SIZE - scrollY); 
関連する問題