그래서 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();
@AndrewThompson 얼마나 유용한 코멘트. 나는 C#에서 Java로 (나는 둘다 초보자이다) 옮겨 가고있다. 그리고 저는 광산 프로젝트와 잘 어울리는 튜토리얼을 따릅니다. 그리고 그 남자는 그 차이점을 많이 알려줍니다. :) –
[Full-Screen Exclusive Mode API] (https://docs.oracle.com/javase/tutorial/extra/fullscreen/) – MadProgrammer
*과 같은 적절한 자습서를 실제로 읽을 수 있습니다. " 차이점. "* 나는 1) 캔버스를 렌더링 표면으로 사용하지 않을 것입니다. (대신에'JPanel'을 사용하고'paintComponent()'를 덮어 씁니다.) 2)'Thread'를 사용하여 애니메이션을 만듭니다. (대신에 Swing'Timer'를 사용하십시오.) 3)'BufferStrategy'를 사용하십시오 (더블 버퍼링 된 스윙 패널에서는 불필요합니다). –