2017-11-13 10 views
0

내 게임의 Swing.Timer는 내 배경으로 가져올 이미지의 크기에 따라 작동합니다. 1920 x 1080 크기의 이미지를 가져 오면 타이머가 크게 느려지고 거의 업데이트되지 않지만 완벽한 품질입니다. 이미지 크기가 50 x 50으로 설정되면 타이머는 완벽하게 작동하지만 이미지 자체가 크게 왜곡됩니다. 이 문제를 자바에서 해결할 수있는 방법이 있습니까? 코드는 다음과 같습니다이미지 크기 타이머 문제 만들기

이미지로드 등급 :

public class BufferedImageLoader { 
    Image image; 
    public Image loadImage(String path) { 
     try { 
      image = ImageIO.read(this.getClass().getResource(path)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return image; 
    } 
} 

가로드되는 이미지 나는 문제가 있습니다

public class ImageLoader { 
    BufferedImageLoader bif = new BufferedImageLoader(); 
    public Image spaceship() { 
     return bif.loadImage("/objects/spaceship.png"); 
    } 

    public Image background() { 
     return bif.loadImage("/objects/spaceBackground.png"); 
    } 
    public Image asteroid1() { 
     return bif.loadImage("/objects/v.png"); 
    } 
    public Image background2() { 
     return bif.loadImage("/Other/background.png"); 
    } 
} 

코드 :

public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    if(menu) 
     ms.render(g2); 
    if(game) { 
     g2.drawImage(il.background2(), 0, 0, 1000, 750, this); 
     g2.drawImage(il.spaceship(), dx, 600, 100, 100, this); 
    } 
    if(settings) 
     ss.render(g2); 
    if(credits) 
     cs.render(g2); 

} 

위원장이하여 ImageLoader입니다 객체 문제가 발생했을 때 알았습니다. w를 이해하지 못했습니다. 그것은 일어나고 있습니다 ...

편집 : 배경색 1000, 750 (이 크기는 내가 그린 것처럼)을 만들 때, 타이머는 1920 x 1080 이미지와 매우 유사합니다. 그리고 clunky.

+0

이미지를로드하는 작업은 시간이 많이 소요됩니다. 한 번로드하고 사전 캐시해야합니다. 특히 'paintComponent' 메소드에서 계속로드하지 않아야합니다. – MadProgrammer

+0

그래, 이미지를 미리로드하려고합니다. 그런 다음 paintComponent 메소드 내부에 페인트하면 장비가됩니다. ht. 편집 : 와우 ​​그 모든 고정. 전에 내가 알아 내지 못했던 바보 같은 느낌. 정말 고맙습니다! – Shane

+0

소프트웨어 개발의 멋진 세계에 오신 것을 환영합니다. 심지어 가장 밝은 사람도 정규 기지에서 바보 같이 느껴지기도합니다.) – MadProgrammer

답변

1

이미지를로드하는 데 시간이 오래 걸립니다. 예를 들어, 이미지를 미리로드하고 캐싱하고 단순히 다시 사용하는 것이 좋습니다. 그런 다음

public enum BufferedImageLoader { 
    INSTANCE; 
    private Map<String, BufferedImage> cache = new HashMap<>(); 
    public Image loadImage(String path) { 
     BufferedImage image = cache.get(path); 
     if (image == null) { 
      try { 
       image = ImageIO.read(this.getClass().getResource(path)); 
       cache.put(path, image); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return image; 
    } 
} 

당신은 그냥 할 수

... 엄지 손가락의 일반적인 규칙으로

public class ImageLoader { 
    public Image spaceship() { 
     return BufferedImageLoader.INSTANCE.loadImage("/objects/spaceship.png"); 
    } 

가 수행 할 시간이 걸릴 수 있습니다 당신의 페인트 방법에 아무것도하지, 페인트는 빨리 실행해야 a