2014-12-01 2 views
1

그래서 Youtube에서 Java에 대한 자습서를 진행했습니다. 그러나 "선생님"은 그의 JFrame을 약 400x400 픽셀 크기로만 조정했습니다. 내 전체 화면을 원합니다. 그래서 나는 내 코드로 속일려고 노력했다. (대부분의 해상도에서 실행 가능하기 때문에 1920x1280을 치수로 표현하고 싶지 않았다.)Java - 최대 화면 = 버퍼 깜박임

그러나 숫자를 변경해 보니 나는 "JFrame.MAXIMIZED_BOTH"로 미치광이가되었습니다. 모든 문제를 해결할 것이라고 확신했기 때문입니다. 맞춰봐, 그렇지 않았다. 내가 많이 바뀌었고, 일이 끝나는 지점으로 돌아갈 방법이 확실치 않아서, 전체 주요 클래스 코드를 보여주고 있습니다. 주로 드로잉, 루프 및 버퍼링을 포함합니다 :

import java.awt.Canvas; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 


public class Game extends Canvas implements Runnable{ 
    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = JFrame.MAXIMIZED_BOTH, HEIGHT = JFrame.MAXIMIZED_BOTH, SCALE = 3; 
    public static boolean running = false; 
    public Thread gameThread; 

    private BufferedImage spriteSheet; 

    private Player player; 

    public void init(){ 
     ImageLoader loader = new ImageLoader(); 
     spriteSheet = loader.load("/Grass_road.png"); 

     SpriteSheet ss = new SpriteSheet(spriteSheet); 

     player = new Player(0, 0, ss); 
    } 

    public synchronized void start(){ 
     if(running)return; 
     running = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 
    public synchronized void stop(){ 
     if(!running)return; 
     running = false; 
     try { 
      gameThread.join(); 
     } catch (InterruptedException e) {e.printStackTrace();} 
    } 

    public void run(){ 
     init(); 
     long lastTime = System.nanoTime(); 
     final double amountOfTicks = 60D; 
     double ns = 1000000000/amountOfTicks; 
     double delta = 0; 

     while(running){ 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      if(delta >= 1){ 
       tick(); 
       delta--; 
      } 
      render(); 
     } 
     stop(); 
    } 
    public void tick(){ 
     player.tick(); 
    } 
    public void render(){ 
     BufferStrategy bs = this.getBufferStrategy(); 
     if(bs == null){ 
      createBufferStrategy(3); 
      return; 
     } 
     Graphics g = bs.getDrawGraphics(); 
     //RENDER HERE 
     g.fillRect(0, 0, JFrame.MAXIMIZED_BOTH, JFrame.MAXIMIZED_BOTH); 

     player.render(g); 

     //END RENDER 
     g.dispose(); 
     bs.show(); 
    } 

    public static void main(String[] args){ 
     Game game = new Game(); 
     game.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     game.setMaximumSize(new Dimension(WIDTH, HEIGHT)); 
     game.setMinimumSize(new Dimension(WIDTH, HEIGHT)); 

     JFrame frame = new JFrame("Battle Beasts"); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(true); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setUndecorated(true); 
     frame.add(game); 
     frame.setVisible(true); 

     game.start(); 
    } 

전 화면을 가져오고 테두리를 제거하는 데 성공했습니다. 지금은 모서리에 아주 작은 상자가 있습니다. 단지 몇 픽셀 만 있습니다. 이전과는 달리 휴식은 깜박입니다.

아래쪽 라인은 "g.fillRect (0, 0, JFrame.MAXIMIZED_BOTH, JFrame.MAXIMIZED_BOTH);"라인에서 그린 것 때문에 화면이 깜박입니다. 이제 매우 적은 양의 화면. 모든 해상도에서 전체 화면을 채우려면 어떻게해야합니까?

편집 : Andrew의 단계.

JFrame frame = new JFrame("Battle Beasts"); 
     frame.add(game); 
     frame.pack(); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(true); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setUndecorated(true); 
     frame.setVisible(true); 

     game.start(); 
+0

@AndrewThompson 얼마나 유용한 코멘트. 나는 C#에서 Java로 (나는 둘다 초보자이다) 옮겨 가고있다. 그리고 저는 광산 프로젝트와 잘 어울리는 튜토리얼을 따릅니다. 그리고 그 남자는 그 차이점을 많이 알려줍니다. :) –

+0

[Full-Screen Exclusive Mode API] (https://docs.oracle.com/javase/tutorial/extra/fullscreen/) – MadProgrammer

+1

*과 같은 적절한 자습서를 실제로 읽을 수 있습니다. " 차이점. "* 나는 1) 캔버스를 렌더링 표면으로 사용하지 않을 것입니다. (대신에'JPanel'을 사용하고'paintComponent()'를 덮어 씁니다.) 2)'Thread'를 사용하여 애니메이션을 만듭니다. (대신에 Swing'Timer'를 사용하십시오.) 3)'BufferStrategy'를 사용하십시오 (더블 버퍼링 된 스윙 패널에서는 불필요합니다). –

답변

2

는 어떻게하면 모든 해상도에서 전체 화면을 채울 수 있을까요?

첫째,이 라인을 제거 :

game.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    game.setMaximumSize(new Dimension(WIDTH, HEIGHT)); 
    game.setMinimumSize(new Dimension(WIDTH, HEIGHT)); 

참조 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? (예.) 다음이 주어 어떤 처리, 이상적인 값을 반환 getPreferredSize()를 오버라이드 (override) 게임.

는 다음 변경 :

JFrame frame = new JFrame("Battle Beasts"); 
    // .. 
    frame.add(game); 

사람 :

JFrame frame = new JFrame("Battle Beasts"); 
    frame.add(game); // add this early on, then.. 
    frame.pack(); // immediately call pack() 
    // .. 
+0

게시 한 내용을 변경하려고 시도했지만 디버그 할 때 다음과 같은 오류가 발생합니다. 스레드 "main"의 예외 java.awt.IllegalComponentStateException : 프레임을 표시 할 수 없습니다. \t at java.awt.Frame.setUndecorated (알 수없는 소스) \t Game.main (Game.java:91) ** 오류는 아니지만 콘솔에서 게임이 실행되지 않음 –

+0

'JFrame frame = 새로운 JFrame ("Battle Beasts"),' &'game.start();'(질문 편집 용). 코드 또는 예외 출력을 읽을 수없는 곳에 주석으로 두지 마십시오. –

+0

질문에 추가됨 –