gpt4 book ai didi

Java - 最大化屏幕=缓冲区闪烁

转载 作者:行者123 更新时间:2023-11-30 03:38:51 25 4
gpt4 key购买 nike

所以我正在关注 Youtube 上的 Java 教程。然而,“老师”仅将他的 JFrame 尺寸调整为 400x400px 左右。我希望我的全屏显示。所以我尝试摆弄我的代码(不只是想做 1920x1280 尺寸,因为我希望它在大多数分辨率下都可行)。

但是,当我尝试更改数字时,我对“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);”行绘制的内容现在只填充了屏幕的一小部分。如何使其在所有分辨率下填满全屏?

编辑:安德鲁的步骤;

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();

最佳答案

How do I make it fill a fullscreen on all resolutions?

首先,去掉这些行:

    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() 以返回理想值,然后处理给定的任何值。

然后更改:

    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()
// ..

关于Java - 最大化屏幕=缓冲区闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27220071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com