2012-03-20 5 views
0

BufferedImage 클래스와 함께 Java2D 라이브러리를 사용하여 Java 애플릿으로 게임을 작성하고 있습니다. 이 게임은 처음으로 이미지가 그려지는 시간 (2 ~ 3 초)입니다. BufferImage 파일이 모든 게임이이 방법을 사용하여 시작하기 전에로드됩니다Java 애플릿이 처음으로 BufferedImage (Java2D) 그리기

bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);  
    try { 
      URL url = new URL(a.getCodeBase(), "images//smoke5frames.png"); 
      bufferedImage = ImageIO.read(url);   
    } catch (IOException e) { e.printStackTrace(); }   
    mSmoke = bufferedImage; 

이미지를 그리는 방법을, 나는이 방법을 사용하고 있습니다 : 문제

public void draw(Graphics2D g) {  
g.drawImage(mTextures[iCurrentFrame], mAffineTransform, null); } 

이미지 것은 SheetedSprites, 일반적에서 절단 엔티티가 생성 될 때 게임 플레이 중에 수행되는 스프라이트 시트 :

for each frame in animation... 

myBufferedImage.getSubimage(i * iFrameWidth, 0, iFrameWidth, iHeight); 

이 줄을 제거해도 문제가 해결되지 않았으므로 getSubimage()가 문제가 될만큼 비싸지 않다고 가정합니다.

나는 애니메이션의 각 프레임을 반복 할 수 있으며 모든 것을 빠른 픽스로 그릴 수 있지만 문제에 대해 더 자세히 이해하고 싶습니다.

키퍼는 SheetedSprite가 한 번 그려지면 페이지를 새로 고칠 수 있으므로 문제가 다시 발생하지 않는다는 것입니다. 전에 모든 것이 그려진 후 게임이 완벽하게 원활하게 실행됩니다. 이것은 IE와 Chrome에서 마찬가지입니다 (다른 브라우저에서는 사용하지 않았습니다). 부수적으로,이 문제는 Eclipse 애플릿 뷰어에서 절대로 발생하지 않습니다.

내 최고의 추측은 이미지가 어떻게 든 브라우저에 의해 캐싱된다는 것입니다.하지만 정말로 난처한 상황입니다. 나는 그래픽 라이브러리 (Slick2D, LWJGL, 등)의 다른 세트로 이미지로드/그리기를 시도하지 않았다. 어떤 제안을 주셔서 감사합니다!

+0

어디에서 그래픽 객체를 얻었는지 & draw (G2D)는 어디에서 왔습니까? 사실, 그 정확한 질문에 흠집을 내고 그 대답을 [SSCCE] (http://sscce.org/)로 제공하십시오. –

+0

다음은 이미지를 그리는 데 사용 된 방법을 보여주는 프로젝트의 zip입니다. http://dan.nemmons.net/stack/UnprofStackQuestion.zip 애플릿 하위 클래스에서 화면 크기로 Image 객체를 만듭니다. . image.getGraphics()를 통해이 Image의 Graphics 멤버를 가져옵니다. 각각의 드로 콜은 그래픽을 지우고 Graphics 객체를 Graphics2D에 던지는 게임에 전달합니다. 여기에서 게임은 모든 스프라이트에서 sprite.draw (graphics2d)를 호출합니다. 마지막으로 애플릿의 draw 메소드가 끝나면 이미지를 화면에 그립니다. – Shnagenburg

+0

코드를 편집하여 게시 할 수있는 SSCCE만큼 짧게 만들 수 있습니까? 그것이 내가 볼 것입니다. –

답변

0

약 2 년 전에이 문제가 발생했으며 위대한 Java-gaming.org에서 수정 사항을 발견했습니다. 저에게있어서 문제는 자바가 특정 종류의 png 파일에 문제가 있다는 것입니다. 일부는 처음 활용했을 때 지연을 초래할 수 있고, 그렇지 않은 경우도 있습니다. 이 "fixer-upper-method"는 BufferedImage를 가져 와서 BufferedImage를 반환하지만, 그 사이에 Java가 해독하기 쉽게 이미지를 만드는 마법을 사용합니다 (어떻게 묻지 마세요). 즐기십시오!

private BufferedImage toCompatibleImage(BufferedImage image) 
{ 
    if(image==null)System.out.println("Image is null"); 
    // obtain the current system graphical settings 
    GraphicsConfiguration gfx_config = GraphicsEnvironment. 
      getLocalGraphicsEnvironment().getDefaultScreenDevice(). 
      getDefaultConfiguration(); 

    /* 
    * if image is already compatible and optimized for current system 
    * settings, simply return it 
    */ 
    if (image.getColorModel().equals(gfx_config.getColorModel())) 
      return image; 

    // image is not optimized, so create a new image that is 
    BufferedImage new_image = gfx_config.createCompatibleImage(
        image.getWidth(), image.getHeight(), image.getTransparency()); 

    // get the graphics context of the new image to draw the old image on 
    Graphics2D g2d = (Graphics2D) new_image.getGraphics(); 

    // actually draw the image and dispose of context no longer needed 
    g2d.drawImage(image, 0, 0, null); 
    g2d.dispose(); 

    // return the new optimized image 
    return new_image; 
} 
관련 문제