- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试为类(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
文件夹。也许以前不是这样的
那么您之前使用的代码片段就可以工作了
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/
如果这不是一个错误,那就是另一个错误。如果不是那样的话,那就是别的东西了。我觉得我的项目已经改变了很多,现在只是试图解决代码签名问题,结果一切都搞砸了。我严格按照说明进行操作,但出现错误,例如当前的“
我不确定是否有一些我不知道的内置变量或规则,或者 make 是否有问题,或者我只是疯了。 对于我的一个项目,我有一个如下的 makefile: CC=g++ CFLAGS=-O3 `libpng-co
我有大约 10 个 div,它们必须不断翻转,每个 div 延迟 3 秒 这个 codrops 链接的最后一个效果是我正在寻找的,但无需单击 div http://tympanus.net/Devel
我如何使用 jQuery 持续运行 PHP 脚本并每秒获取响应,以及将鼠标上的少量数据发送到同一脚本? 我真的必须添加一些随机扩展才能让这么简单的计时器工作吗? 最佳答案 To iterate is
JBoss 4.x EJB 3.0 我见过如下代码(大大简化): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPO
使用 PHPStorm,我试图忽略每次尝试进行 git 提交时 pop 的 workspace.xml。 我的 .gitignore 看起来像: /.idea/ .idea/workspace.xml
我是一名优秀的程序员,十分优秀!