韩顺平零基础学Java 击中第一个坦克不爆炸问题

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);
        }
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值