java - 定时器延迟太少时对象消失
问题描述
因此,当我在制作一个小型 TD 游戏时,我遇到了弹丸的问题。我写了一个方法,它允许我从一个设定的位置向一个设定的位置射击一个射弹。为了使弹丸移动,我使用了一个延迟 10 毫秒的计时器。但是当我执行代码时,似乎什么也没发生。然后我回顾了我的代码,发现问题显然只是一个视觉问题,因为弹丸的坐标像预期的那样发生了变化。
然后,我为这个问题找到了两个“修复”,我对此不太满意。
首先,如果延迟为 16 毫秒或以上,则显示弹丸。但我希望射弹在不增加移动量的情况下移动得更快,否则它们可能会穿过敌人而不会在碰撞箱中出现一次。
其次,如果我在每次改变弹丸的位置后简单地调用 JFrame 上的 repaint 方法,它也可以工作。但我听说,在循环中或快速连续调用 repaint 方法会对性能产生非常糟糕的影响。
如果有人找到解决此问题的方法,那就太好了。如果我弄错了,在这种情况下使用重绘方法很好,那当然很好,但我通常也很好奇是什么原因造成的。所以提前谢谢你。
package pack;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
public class Test {
Timer timer;
JFrame jf;
JLabel lbl;
double addX = 500;
double addY = 250;
public Test() {
jf = new JFrame();
jf.setSize(1536, 864);
jf.setVisible(true);
lbl = new JLabel(new ImageIcon("rsc/dot.png"));
lbl.setSize(10, 10);
lbl.setVisible(true);
jf.add(lbl);
jf.repaint();
timer = new Timer(15, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
lbl.setLocation(lbl.getX() + 10, 432);
}
});
timer.start();
}
}
这个问题显然在某种程度上与对象的大小有关,因为显示了一个大小为 20 像素的对象(至少部分显示)。同样,如果将延迟增加到 16 毫秒,它也会产生类似的效果。
解决方案
推荐阅读
- node.js - 如何从 Mongo ObjectIDs 数组中获取多个项目
- spring - 我在 Spring Boot 项目中使用 snmp,当我在控制器中输入路由时收到此错误消息
- android - Kotlin 扩展所有合成导入未解决
- python - Flask-SQLAlchemy sqlalchemy.exc.OperationalError 没有这样的表'comic'
- html - 字体真棒图标未在 html 中显示
- drools - 确定决策表中的哪些字段与事实不匹配
- sqlite - sql中的vlookup,将值带到另一个表
- node.js - 如何在一个 Express app.get() 中使用多个 res.render()
- python - 是否使用带有 CountVectorizer 和 TfidfTransform 的管道将输入数据转换为文档项矩阵?
- wordpress - 如何在 Wordpress tax_query 中为自定义分类法进行部分匹配