2016-12-12 2 views
0

PNG 파일에서 (600/448) 화면에 레벨 (1600/448)을 렌더링하려고합니다. 그것은 렌더링하려고 시도하지만 성공하지 못합니다. 그렇게하는 동안 게임 루프가 멈추는 것 같습니다. 타일이 많기 때문에 이런 일이 일어나고 있다고 생각합니다.하지만 어떻게하면 갈 수 있는지 잘 모르겠습니다.Java가 PNG 이미지에서 타일을 렌더링하는 데 너무 오래 걸립니다.

public void loadLevel(BufferedImage image) { 
    int width = image.getWidth(); 
    int height = image.getHeight(); 

    for (int xx = 0; xx < width; xx++) { //width = 1600 
     for (int yy = 0; yy < height; yy++) { //height = 448; 
      Color c = new Color(image.getRGB(xx,yy)); 
      int red = c.getRed(); 
      int green = c.getGreen(); 
      int blue = c.getBlue(); 

      if (red == 225 && blue == 225 & green == 225) { 
       objectHandler.add(new GrassRight(xx * 32, yy * 32, ObjectId.GrassRight)); 
      } else if (red == 129 && blue == 250 & green == 212) { 
       objectHandler.add(new Player(xx * 32, yy * 32, objectHandler, ObjectId.Player)); 
      } else if (red == 0 && blue == 0 && green == 0) { 
       objectHandler.add(new Dirt(xx * 32, yy * 32, ObjectId.Dirt)); 

      } else if (red == 144 && blue == 144 & green == 213) { 
       objectHandler.add(new Grass(xx * 32, yy * 32, ObjectId.Grass)); 

      } else if (red == 38 && blue == 56 & green == 50) { 
       objectHandler.add(new GrassLeft(xx * 32, yy * 32, ObjectId.GrassLeft)); 

      } else if (red == 62 && blue == 35 & green == 39) { 
       objectHandler.add(new SlideRight(xx * 32, yy * 32, ObjectId.SlideRight)); 

      } else if (red == 191 && blue == 12 & green == 54) { 
       objectHandler.add(new SlideLeft(xx * 32, yy * 32, ObjectId.SlideLeft)); 

      } else if (red == 127 && blue == 194 & green == 87) { 
       objectHandler.add(new DownSlideLeft(xx * 32, yy * 32, ObjectId.DownSlideLeft)); 

      } else if (red == 49 && blue == 146 & green == 27) { 
       objectHandler.add(new DownSlideRight(xx * 32, yy * 32, ObjectId.DownSlideRight)); 
      } 
     } 
    } 
} 


public void init() { 
    System.out.println("Loading..."); 
    LoadingHandler loadingHandler = new LoadingHandler(); 
    level = loadingHandler.loadImage("/Level1.png"); 
    objectHandler = new ObjectHandler(); 
    cameraHandler = new CameraHandler(0, 0); 
    this.addKeyListener(new KeyHandler(objectHandler)); 
    loadLevel(level); 
    System.out.println("Done!"); 
} 

public void render() { 
    BufferStrategy bs = this.getBufferStrategy(); 
    if (bs == null) { 
     this.createBufferStrategy(3); 
     return; 
    } 
    Graphics g = bs.getDrawGraphics(); 
    Graphics2D g2d = (Graphics2D) g; 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g2d.translate(cameraHandler.getX(), cameraHandler.getY()); 
    System.out.println("Rendering!"); 
    objectHandler.render(g); 
    System.out.println("Rendered!"); 
    g2d.translate(-cameraHandler.getX(), -cameraHandler.getY()); 
    g.dispose(); 
    bs.show(); 

} 

public class ObjectHandler { 
public LinkedList<ObjectManager> object = new LinkedList<>(); 

ObjectManager tempObject; 

public void tick() { 
    for (int i = 0; i < object.size(); i++) { 
     tempObject = object.get(i); 
     tempObject.tick(object); 
    } 
} 

public void render(Graphics g) { 
    for (int i = 0; i < object.size(); i++) { 
     tempObject = object.get(i); 
     tempObject.render(g); 
    } 
} 

public void add(ObjectManager object) { 
    this.object.add(object); 

} 

그리고이 출력 밖으로 준다 :

Loading... 
Done! 
Rendering! 

PNG :

enter image description here

+0

프로세스가 완전히 실행되었거나 중간에 중단 되었습니까? – user3437460

+0

@ user3437460 사실 반쯤 멈췄다. "렌더링 됨"을 인쇄하지 못했습니다. – NattoShaw

+0

코드가 완전하지 않습니다 ... 다양한 문제를 추측 할 수 있습니다. –

답변

3

대신에 각 화소 (즉 716'800 개체이다)에 대한 객체를 생성 작성을 직사각형 영역 당 하나의 객체 (15 개 객체).

UPDATE :

클래스 ObjectManager에서

, 두 INT 필드를 추가 : 폭과 높이가, 다음 대신 하나의 픽셀 (또는 32 × 32 광장)의 전체 사각형을 렌더링합니다. PNG를 사용하여 개체를 초기화 할 수 있지만 각 픽셀에 대해 새 개체를 다시 생성하지 않는 더 똑똑한 알고리즘을 사용할 수 있습니다.

+0

당신은 나를 이끌어 줄 수 있었으면 좋겠 는가? 그럴거야 – NattoShaw

+0

이러한 개체 (GrassRight, Player, SlideLeft 등)는 어떻게 렌더링됩니까? –

+0

GrassRight 클래스에는 렌더링 메서드가 있습니다. public void render (Graphics g) { g.setColor (Color.green); g.drawRect ((int) x, (int) y, 32, 32); } 다음에 for 루프에서 ObjectHandler 클래스로 읽습니다. public void render (Graphics g) { for (int i = 0; i NattoShaw