首页 > 解决方案 > 定时器延迟太少时对象消失

问题描述

因此,当我在制作一个小型 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 毫秒,它也会产生类似的效果。

标签: javatimergraphics2d

解决方案


推荐阅读