我目前正在尝试为一个班级创建一个游戏,并且我决定尝试加载GUI并显示背景图像。
但是,我决定创建一个具有HashMap的单例ImageLoader类,该类缓存已加载一次的图像并存储和/或返回新的BufferedImages。这样做的主要目的是轻松有效地访问即将发射的多个敌方实体/导弹的精灵。
现在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
文件夹中。也许不是以前然后您之前使用的代码段就可以了
BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
"resources/stackoverflow.png");
.....
URL location = this.getClass().getClassLoader().getResource(place);
请注意,在上述情况下,使用
getClass().getResource()
而不使用classLoader()
时,您的路径应以/
开头