2012-02-11 1 views
1

안녕하세요. 저는 2D 게임을 만들고 있고 4 개의 사전 설정된 이미지에서 임의의 잔디 배경을 생성하고 있습니다. 내 문제는이, 내 게임이 코드를 사용하기 시작 게임에 생성 된 배열에서 각각의 이미지를 그립니다 : 잘 작동Java : 그래픽에서 이미지를 가져 와서 임시 BufferedImage로 변환하십시오.

public static void createBackground() { 
    for(int x = 0; x < 640; x+= 32) { 
     for(int y = 0; y < 496; y+= 32) { 
      random = new Random(); 
      int grassTex = random.nextInt(grassTextures.size()); 

      grassPos.add(grassTextures.get(grassTex)); 
     } 
    } 
} 

하지만, 문제가 발생하는 곳이다. 이 FPS의 저하를 (그것은 많은 아니지만이 눈에 띈다)가 발생

public static void paintBackground(Graphics g) { 
    counter = 0; 
    for(int x = 0; x < 640; x+= 32) { 
     for(int y = 0; y < 496; y+= 32) { 
      random = new Random(); 

      int grassTex = random.nextInt(grassTextures.size()); 
      g.drawImage(grassPos.get(counter), x, y, null); 
      counter++; 

     } 
    } 

} 

:이를 사용하여 해당 배열에 넣고 모든 이미지를 다시 그리기입니다. 어쨌든 모든 풀 이미지를 하나의 BufferedImage로 그려서 그려지는 이미지가 하나뿐입니다. 아니면 이것을하는 더 효율적인 방법이 있습니까?

감사합니다.

+1

제쳐두고 하나의 '랜덤 (Random)'을 만들고 루프 반복마다 하나를 만드는 대신 그것을 재사용하십시오. – McDowell

답변

3

당신이 묻는 것처럼 "그래픽에서 이미지"를 가져갈 방법이 없지만 대신 BufferedImage를 만든 다음 이미지를 그 안에 그려 넣는 것은 그리 어렵지 않습니다. 어떤 경우, AWT의 이미징 모델은 매우 복잡하며, 당신은 보조 데이터 구조와 재료의 몇 가지를 구성해야하지만, 여기에 32 비트 RGBA 이미지를 생성하는 템플릿입니다 :

private static final ComponentColorModel colormodel = 
    new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 
          new int[] {8, 8, 8, 8}, true, false, 
          ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE); 
public static BufferedImage makeimage(int w, int h) { 
    WritableRaster buf = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, w, h, 4, null); 
    return(new BufferedImage(colormodel, buf, false, null)); 
} 

당신이 BufferedImage를 일단을 makeimage()에 의해 생성 된대로 getGraphics()을 호출하고 마음의 내용을 칠하십시오.