ゲームでよく使われる横スクロール表示の実験です。ビットマップ作成に一定間隔の処理、マップチップの描画とゲームプログラミングの演習にも適していますね。 Startボタンを押すと右にスクロールしていきます(ゲームプログラミング開発メモに4方向マップスクロールもあり)。 スクロールさせるマップとパーツ スクロールさせるには、スクロール表示する「世界」を表したマップと海や山、草原などのドット絵パーツを用意します。マップは、海を0草原を1などという数値で表現して、表示する時にその数値を見て海(0)や草原(1)のパーツを表示して行くわけです。マップの座標は左上を(0、0)とします。 for (i=0;i<16;i++) /*最初の画面を作成*/ for (j=0;<16;j++) g_screen.drawImage(parts[map[j][i]],j*16,i*16,this); という感じになります。map[x][y]を見れば(x,y) にある地形が読め、今回はその地形番号がそのまま表示すべきイメージの番号になっているわけです(実際のゲームではマップに地形だけでなくイベントなどの情報も入るので、地形を読み出す時にはもう少し処理が必要になります)。 次に、イメージを2枚用意します。一枚は実際に画面に表示する表示用のイメージで、もう1枚はスクロールするマップを描くためのバッファです。大きさは表示用イメージの方が256*256 ピクセル(マップパーツ16*16個分)でスクロール用が272*256 ピクセル(マップパーツ17*16個分)。スクロール表示させる時には、いったんバッファの方にパーツを描いて、そのバッファイメージを「ずらしながら」表示用イメージに転送します。 スクロール表示の方法 今回は、右スクロールだけなので横方向のみを考えましょう。まず、現在のxから右方向に横17個分のパターンを、スクロール用の作業用バッファイメージに描き出します。こうするとスクロール用イメージには、現在表示されている16*16個のパターンの他に右端に1列その右側のパターンが描かれている事になりますね。この部分がスクロール表示の本質ともいうべき部分です。 スクロール処理部分のリストpublic void run() { int i,j,x; x=0; // 現在位置をマップの左端に設定 while(running && x<110) { // 右端に来るまで右方向スクロール for (i=0;i<16;i++) // バッファにスクロールさせるイメージを描く for (j=0;j<17;j++) g_scrol.drawImage(parts[map[j+x][i]],j*16,i*16,this); for (i=0;i<16;i++) { // バッファを左にずらしながら表示 g_screen.drawImage(scrol,-i,0,this); // 表示用イメージをアプレットに描画 Graphics g=getGraphics(); paint(g); g.dispose(); try { Thread.sleep(10); } // ウエイト catch (InterruptedException e) {} } x++; // マップ上の位置を1つ右にずらす } } 今回のプログラムはJavaで書いてありますが、他の処理系でも原理は同じです。ただし、DelphiやVC++ などでWindowsアプリケーションにする時には、スレッドを作るまでもないでしょう。ループさせながら、適当に再描画をかけてやれば十分です。 |