2012-01-31 2 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 

이 다음 부분은 저를 혼란 것입니다. i와 j는 무엇을위한 것이며, 왜 그것을 더하거나 늘릴까요? 이 부분은 하위 이미지의 크기를 알아내는 것입니다. 행 x * cols 인 13x14일까요?

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(); 
    } 
    } 
} 

나는 내가하고있는 일을 얻지 못한다. 내가 여기서 무엇을 놓치고 있니?

답변

3

j * width, 
i * height, 

은 또한 폭과 높이가 단일 문자의 크기가 너무 큰 것 같다하지만이 같은 사용되어야한다.

i는 문자 행을 통과하고 j는 열을 통과합니다. 위치 (j, i)에 문자의 좌표를 얻으려면 너비 (각 문자의 너비)와 i (행 색인)의 높이 (문자)로 여러 j (열의 색인)가 필요합니다.

letters는 글자에 해당하는 이미지 배열입니다.

letters[(i * cols) + j] 

은 직사각형 행렬을 1 차원 배열로 바꾸는 표준 관용구입니다. 그림 참조 :

0 1 2 
0 A B C 
1 D E F 

그래서이 배열 F의 인덱스는 1 * 3 + 2 = 5 일 것이다

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

으로 배열에 저장 취득을 여기서 I = 1, J = 2, cols = 3 (3 개의 열이 있기 때문에)

+0

다른 문자의 색인을 찾을 때마다 '행'과 '열'이 변경되어야한다는 의미입니까? 이후 나는 최종 int 행 = 4; final int cols = 13; j와 i를 항상 col과 행과 동일하게 만드는 for 루프 때문에 항상 "letters [(4 * 4) + 13]"이 아닐까요? – GlassZee

+1

행과 열은 루프의 상한입니다. i와 j는 0에서 rows/cols로 정중하게 변경되므로 (i * cols) + j 표현식은 각 루프 반복에서 문자 배열의 다른 인덱스로 평가됩니다. –

+0

좋아, 나는 루프가 작동하는 방법에 대해 혼란 스러웠다. 감사 – GlassZee

관련 문제