所以,今天我决定尝试在不使用教程的情况下制作自己的游戏,如果我遇到问题,请尝试自己解决。但是,这个问题是我不明白的。
这是我的代码: 游戏类(应该呈现图像的位置):
public class Game extends Canvas implements Runnable {
private static final long serialVersionUID = 1L;
private int width = 350;
private int height = 200;
private int scale = 3;
private Dimension size = new Dimension(width * scale, height * scale);
private Thread thread;
private boolean running = false;
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
private Loader loader;
public Game() {
JFrame frame = new JFrame("Game");
frame.setPreferredSize(size);
frame.setMaximumSize(size);
frame.setMinimumSize(size);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(this);
frame.setVisible(true);
loader = new Loader();
}
public static void main(String[] args) {
Game game = new Game();
game.start();
new Images();
}
public void render() {
BufferStrategy bs = super.getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.drawImage(Images.TEST, 10, 10, null);
g.dispose();
bs.show();
}
public synchronized void start() {
if (running)
return;
else
running = true;
thread = new Thread(this);
thread.start();
}
public synchronized void stop() {
if (!running)
return;
else
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getScale() {
return scale;
}
}
Loader类(我加载图片的地方):
public class Loader {
public BufferedImage loadImage(String fileName) {
try {
System.out.println("Trying to load: " + fileName + " ... succeded!");
return ImageIO.read(new File(fileName));
} catch(Exception e) {
e.printStackTrace();
}
System.out.println("Trying to load: " + fileName + " ... failed!");
return null;
}
}
我的图像类,所有图像都设置为文件:
public class Images {
public static Loader loader;
public static final BufferedImage TEST;
static {
Loader loader = new Loader();
TEST = loader.loadImage("res/test.png");
}
}
我想做的只是简单地在屏幕上显示图像,但这种方法似乎不起作用。我不知道我做错了什么。 并且,不,我没有放入图像的错误目录。 提前谢谢!
答案 0 :(得分:0)
由于run
为空,因此没有任何内容正在执行更新/绘制周期。首先更新run
方法以执行调用render
...
@Override
public void run() {
while (running) {
render();
}
}
BufferStrategy
的要点是控制绘画过程,所以你现在要负责执行它
接下来,摆脱getWidth
和getHeight
,这将导致问题没有结束,我浪费时间试图弄清楚为什么它没有显示我的完整图像。
以下......
frame.setPreferredSize(size);
frame.setMaximumSize(size);
frame.setMinimumSize(size);
是一个坏主意,因为框架包含窗口装饰,因此您可用的内容大小将减少窗口装饰的大小,这可能是您不希望的。
相反,请将其替换为......
@Override
public Dimension getPreferredSize() {
return size;
}
并在窗口上调用pack
以围绕所需的内容大小打包窗口装饰。
不要让我开始frame.setResizable(false);
TEST = loader.loadImage("res/test.png");
让我担心。如果res/test.png
嵌入在您的应用程序Jar中,则加载过程将失败。如果它已外部化到磁盘,那么如果工作目录与安装目录不同,那么加载图像会出现问题 - 只需要警告