gpt4 book ai didi

java - 由于图像加载,GUI 不断崩溃?

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

我目前正在尝试为类(class)创建游戏,并且我决定尝试加载 GUI 并显示背景图像。

但是,我决定创建一个单例 ImageLoader 类,该类具有一个 HashMap,用于缓存已加载一次的图像并存储和/或返回新的 BufferedImage。其主要目的是轻松有效地访问即将实现的多个敌方实体/发射的导弹的 Sprite 。

现在 Game 类尚未完成,但它应该运行,它确实运行了!只是不像我预期的那样。

我希望它能够运行并显示带有背景图像的 GUI,但是 GUI 仅显示了一瞬间,然后就崩溃了。

这里是Game类(在runGameLoop方法中绘制图像)

import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class Game extends Canvas{

private JFrame frame;
private BufferStrategy strat;
private boolean stillPlaying;


public Game(){
frame = new JFrame("Pirate Game!");

frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

frame.getContentPane().add(this);
setIgnoreRepaint(true);
frame.setSize(800,600);
setBounds(0,0,800,600);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
this.createBufferStrategy(2);
strat = getBufferStrategy();
stillPlaying = true;
}

public static void main(String[] args) {
Game g = new Game();
g.runGameLoop();
}

private void runGameLoop() {
long initLoop = System.currentTimeMillis();
//while(stillPlaying){
long change = initLoop - System.currentTimeMillis();
initLoop = System.currentTimeMillis();
Graphics2D gfx = (Graphics2D) strat.getDrawGraphics();
BufferedImage sourceImage = ImageLoader.getImageLoader().getImage("resources/Untitled.jpg");
gfx.drawImage(sourceImage,0,0,null);
//}
}

}

这是 ImageLoader 类

import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.HashMap;

import javax.imageio.ImageIO;


public class ImageLoader {

private HashMap<String,BufferedImage> storedImages = new HashMap<String,BufferedImage>();
private static ImageLoader single = new ImageLoader();

public static ImageLoader getImageLoader() {
return single;
}

public BufferedImage getImage(String place) {
BufferedImage image=null;
if (storedImages.containsKey(place))
return storedImages.get(place);
else{
try{
URL location = this.getClass().getClassLoader().getResource(place);
if(location == null)
System.exit(0);

image = ImageIO.read(location);
}
catch(Exception e){
System.out.println(e);
System.exit(0);
}

storedImages.put(place,image);
return storedImages.get(place);
}
}


}

感谢您的帮助!我愿意接受批评。

最佳答案

您的图像应该与尝试加载它们的类位于同一包中。一个简单的解决方法是复制所有图像(如果您使用的是 IDE),右键单击包,然后粘贴。只要您仅使用图像文件名作为路径,即“mypic.png”,它应该可以正常工作。

<小时/>

编辑

所以我让它停止关闭。我所做的就是改变这个

URL location =  this.getClass().getClassLoader().getResource(place);

URL location =  this.getClass().getResource(place);

唯一的问题是图像没有绘制。我不太清楚如何 Canvas有效,它是 AWT,我只熟悉 Swing,所以我将其更改为 JPanel并覆盖 paintComponent方法。并做了一些其他微妙的改变。你可以检查一下。如果您有任何疑问,请告诉我。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel {

private JFrame frame;
private BufferStrategy strat;
private boolean stillPlaying;

public Game() {
frame = new JFrame("Pirate Game!");

frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

frame.getContentPane().add(this);
setIgnoreRepaint(true);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
stillPlaying = true;
}

public static void main(String[] args) {
Game g = new Game();
g.runGameLoop();
}

private void runGameLoop() {
long initLoop = System.currentTimeMillis();
// while(stillPlaying){
long change = initLoop - System.currentTimeMillis();
initLoop = System.currentTimeMillis();
//Graphics2D gfx = (Graphics2D) strat.getDrawGraphics();
//BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
//"stackoverflow.png");
//gfx.drawImage(sourceImage, 0, 0, null);
// }
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
"stackoverflow.png");
g.drawImage(sourceImage, 0, 0, this);
}

public Dimension getPreferredSize() {
return new Dimension(800, 600);
}

}
<小时/>

另一种可行的方法是如果你的 resources位于 src文件夹。也许以前不是这样的

enter image description here

那么您之前使用的代码片段就可以工作了

BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
"resources/stackoverflow.png");

......

URL location = this.getClass().getClassLoader().getResource(place);

注意,在上述场景中,当使用 getClass().getResource() 时,没有 classLoader() ,您的路径应以 / 开头

关于java - 由于图像加载,GUI 不断崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010464/

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