2012-01-31 5 views
0

申し訳ありませんが、これはコードの一部ですが、ここで切り抜けることはあまりありません。これは、イメージ(アルファベットのスプライトシート)を読み込んで、個々の文字であるより小さなサブイメージに分割することになっています。キーを押すと、対応する文字が画面に表示されますが、この部分は実際のサブイメージを作成するためのものです。Java:このスプライトシートの読書コードの一部を理解していないのですか?

http://i.imgur.com/4I4uX.png(画像)

package typeandscreen; 
(where the imports should be, i just cut them out to save space) 
public class Font{ 

    final int width = 78; //gives the dimensions of the image 
    final int height = 32; 
    final int rows = 4; 
    final int cols = 13; 

BufferedImage letters[] = new BufferedImage[rows*cols]; //makes the array of 
                 //subimages. rows*cols is 
                 //the number of subimages 
void test(){ 
    try{ 
     final BufferedImage totalImage = ImageIO.read(new File("ABCabcs.png")); 
       //loads the big image itself 

これ以下の部分は私が混乱するものです。私とjは何のために、なぜそれらを追加して乗算するのですか?この部分は、サブイメージの大きさを知るためのものです。それはちょうど4×13でなければならないのですが、それは行*列ですか?

for(int i = 0; i < rows; i++){ 

     for(int j = 0; j < cols; j++){ 
      letters[(i * cols) + j] = totalImage.getSubimage(
       j * width, 
       j * height, 
       width, 
       height 
      ); 
     } 
    } 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 
    } 
} 

iとjが何をしているのかわかりません。私はここで何が欠けていますか?それは

j * width, 
i * height, 

そしてまた、幅と高さでなければなりません

答えて

3

は、単一文字のサイズには大きすぎるように見えるが、彼らはそのように使用されています。

私は文字の行を通過し、jは列を通過します。位置(j、i)にある文字の座標を取得するには、幅(各文字の幅)とi(行のインデックス)から高さ(文字の)で複数のj(列のインデックス)を設定する必要があります。

文字は、文字に対応する画像の配列です。

letters[(i * cols) + j] 

は、長方形の行列を1次元配列にするための標準的なイディオムです。

0 1 2 
0 A B C 
1 D E F 

0 1 2 3 4 5 
A B C D E F 

として、配列に格納され得るので、この配列内のFのインデックス= 5 1 * 3 + 2ここで、i = 1、J = 2であり、そして:画像を見ますcols = 3(3つの列があるため)

+0

これは、 '行'と '列'が別の文字のインデックスを検索するたびに変更する必要があることを意味しますか?私は 最終int行= 4を持っているので、 final int cols = 13; jとiを常にcolとrowsに等しくするforループがあるため、これは常に "letters [(4 * 4)+ 13]"ではありませんか? – GlassZee

+1

行と列はループの上限です。 iとjは0からrows/colsに敬意を持って変化するので、(i * cols)+ jの式は各ループ反復で文字配列の異なるインデックスに評価されます。 –

+0

さて、私はどのようにループが働いたのか混乱していました。ありがとう – GlassZee

関連する問題