当前位置:网站首页>drawImage方法第一次调用不显示图片的解决方式
drawImage方法第一次调用不显示图片的解决方式
2022-07-27 06:32:00 【爱学习的大雄】
问题
在写坦克大战的时候,子弹击中敌方坦克后会显示爆炸效果,但是子弹第一次击中敌方坦克时不会显示爆炸效果。通过debug后发现是Graphics类调用drawImage绘制图片时出现问题。
boolean b=false;
b=g.drawImage(imgError,thex(i),they(j),this);
原因
在开始的一段时间内g.drawImage返回值b经常会是false,导致显示不正常,但是,只要显示一段时间后,即该函数被调用若干次后返回值b就会一直是true,再也不会返回false了。
当drawImage这个方法中的图片没有被完全加载的时候,这个方法会返回false。drawImage方法是在调用的时候才加载所需要的图片,所以第一次调用的时候,图片没有被完全加载,造成显示的不正常,甚至不显示图片,此后,图片由于方法调用被加载,以后再以这幅图片为参数的时候,就可以正常显示了。
解决方式
使用MediaTracker类:
Image img = Toolkit.getDefaultToolkit().getImage(imgPath);
MediaTracker t = new MediaTracker(this);
t.addImage(img, 0); //img就是你要显示的图片
t.waitForAll();
将这段代码在drawImage()之前调用,MediaTracker可以确保你的图片在DRAW前被加载以备使用。通过addImage方法加入一个Image并符上一个ID号,waitForAll()等待加入的所有图片被加载完毕。也就是说先前只要正常显示过一次了,那么应该图片已经加载好了,此后此图片就再也不会出现返回false而不能正常显示了。
如果只使用drawImage那么是在调用的时候加载图片,如果这个图片在本地,那么加载好图片的速度相当的快。再次调用drawImage方法的时候就能正常显示了。也可以在初始化时对每个图片显示一下,直到每个图片显示都返回true,这样之后就不会再出现不正常的显示了。
示例
//解决第一次不显示图片的问题
MediaTracker t = new MediaTracker(this);
t.addImage(images[16-bomb.getLife()], 0);
try {
t.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
g.drawImage(images[16-bomb.getLife()],bomb.getX(),bomb.getY(),60,60,this);
//让这个炸弹是生命值减少
bomb.lifeDown();
//如果bomb的life为0,则从集合中去除
if (bomb.getLife()==0){
bombs.remove(bomb);
}

边栏推荐
- ?实验 7 基于 Mysql 的 PHP 管理系统实现
- 在Perl程序中暴露Prometheus指标
- Use reflection to dynamically modify annotation attributes of @excel
- 在kettle使用循环来处理表中的数据
- C程序代码的内存结构分析
- Array method and loop in JS
- Advanced IO outline
- 【WSL2】配置连接 USB 设备并使用主机的 USB 摄像头
- Using loops to process data in tables in kettle
- STM32_找到导致进入HardFault_Handler的函数
猜你喜欢

软件测试十大必问面试题(附答案和解析)

Single arm routing (explanation + experiment)

(2022 Hangdian multi school III) 1009.package delivery (greedy)

SQLite 常用功能整合

35. Search Insert Position 搜索插入位置

Esp8266 (esp-12f) third party library use -- sparkfun_ Apds9960 (gesture recognition)

Jmeter:接口自动化测试-BeanShell对数据库数据和返回数据比较

利用 Amazon DynamoDB 和 Amazon S3 结合 gzip 压缩,最大化存储玩家数据

C# Winfrom 常用功能整合-2

docker安装MySQL8.0.28
随机推荐
C语言 pthread_cleanup_push()和pthread_cleanup_pop()函数(用于临界资源程序段中发生终止动作后的资源清理任务,以免造成死锁,临界区资源一般上锁)
(2022 Hangdian multi school III) 1011.taxi (Manhattan maximum + 2 points)
零号培训平台课程-2、SSRF基础
36 - new promise method: allsettled & any & race
Using loops to process data in tables in kettle
UiAutomator常用类之UI手势动作
Introduction to network -- overview of VLAN and trunk
一款开源 OA 办公自动化系统
ClickHouse 笔记1 | 简介、特点 | 基于CentOS7系统的安装与使用 | 常用数据类型 | MergeTree 表引擎 | SQL操作
Please ask the big guys a question. The pgsqlcdc task can't monitor changes after running for a period of time. Just restart it. What should I do
SQLite 常用功能整合
functools模块
使用popen来执行一个命令并获得返回结果
oracle的触发器的使用举例
用户解锁SM04 SM12
Essay: college entrance examination
JS make a traffic light
C4D动画如何提交云渲染农场快速渲染?
Jmeter: interface automation test - BeanShell compares database data and return data
QT连接sqlite数据库的错误及其修改办法