1.问题描述
B站视频:
【【零基础 快速学Java】韩顺平 零基础30天学会Java】https://www.bilibili.com/video/BV1fh411y7R8?p=606
P606中,实现了子弹击中坦克的爆炸效果.但是存在一个问题,击中第一辆坦克,没有爆炸效果;但是第二辆,第三辆都有爆炸效果.
2.问题原因
原因在与读取图片的api有问题,看不懂底层实现,只知道debug的时候,在子弹击中第一辆坦克前,读片数据并没有读取到Image变量中.而在击中第一辆坦克后,有莫名其妙的把图片数据加载到image变量中.
问题代码:
private Image[] images=new Image[3];
.....
images[0]=Toolkit.getDefaultToolkit().getImage(GamePanel.class.getResource("/bomb_1.gif"));
images[1]=Toolkit.getDefaultToolkit().getImage(GamePanel.class.getResource("/bomb_2.gif"));
images[2]=Toolkit.getDefaultToolkit().getImage(GamePanel.class.getResource("/bomb_3.gif"));
....
为什么说是这个api的问题,启动后,在paint方法中打了个端点,查看iamges中的图片数据,发现显示"No data":
而去掉断点放行,用子弹击中第一辆坦克后,继续打断点,再次查看images中的数据,能够看到加载的图片
但是关于Image的底层代码我看不懂,更进一步的原因是什么我也不知道,有没有懂的兄弟姐妹在评论区说下?
3.问题处理
这里提供两种处理方法:
1.既然使用Toolkit第一次没有加载数据,先在paint方法中调用一次drawImage方法,把三张图片都画一遍.这样子弹打坦克的时候,就能正常显示保障效果.
大概入下:
// 我的JPanel面板是1200*800,因此图片画在(1400,300)位置不会显示出来
public void paint(Graphics g){
super.paint(g);
this.graphics=g;
//设置场景背景为黑色
g.setColor(Color.BLACK);
//绘制矩形,铺满整个窗口
g.fillRect(0,0,width,height);
myTank.drawTank(g);
g.drawImage(images[0],1400,140,60,60,this);
g.drawImage(images[1],1400,240,60,60,this);
g.drawImage(images[2],1400,340,60,60,this);
....
}
2,使用ImagesIO.read(File file)方法代替Toolkit
示例:
try {
File file1=new File("/bomb_1.gif");
File file2=new File("/bomb_2.gif");
File file3=new File("/bomb_3.gif");
images[0]= ImageIO.read(file1);
images[1]= ImageIO.read(file2);
images[2]= ImageIO.read(file3);
} catch (IOException e) {
throw new RuntimeException(e);
}