Java Swing Graphics2d旋转跳跃

Java Swing Graphics2d旋转跳跃,java,swing,graphics2d,Java,Swing,Graphics2d,为了学习,我正在写一个简单的游戏。一切都很好,除了一件小事 我想不出如果没有这种难看的跳跃,如何旋转正方形 这里是我的程序的简化版本,说明了一个问题,这里我使用一个计时器,但在原始程序中我有两个计时器,一个用于处理游戏状态,另一个用于重新绘制: public class soQuestion extends JLabel { double r; @Override public void paintComponent(Graphics g1) { G

为了学习,我正在写一个简单的游戏。一切都很好,除了一件小事

我想不出如果没有这种难看的跳跃,如何旋转正方形

这里是我的程序的简化版本,说明了一个问题,这里我使用一个计时器,但在原始程序中我有两个计时器,一个用于处理游戏状态,另一个用于重新绘制:

public class soQuestion extends JLabel {

    double r;

    @Override
    public void paintComponent(Graphics g1) {
        Graphics2D g = (Graphics2D) g1;
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g.clearRect(0,0, getWidth(), getHeight());
        g.translate(getWidth()/2, getHeight()/2);
        g.rotate(r);
        g.translate(-20, -20);
        g.fillRect(0, 0, 40, 40);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        soQuestion question = new soQuestion();
        frame.add(question);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        new javax.swing.Timer(10, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                r += 0.005;
                question.repaint();
            }
        }).start();
    }
}
如果旋转增量值较小,则跳跃更可见,因为快速旋转的对象不太可见

我使用的所有渲染提示都无效

PS:对不起我的英语

PPS:如果需要,我可以提供更多详细信息,完整版本的外观:


我是一名新撰稿人,因此,如果这不是最好的帮助,sry,但我正在努力:)

您是否尝试过在g.rotate()函数中使用Math.torradiants()的解决方案?在本视频中: 图像旋转而不跳跃,在视频中是6:42


在你的解中,它看起来是这样的:
g.rotate(Math.torradiants(r+=0.005))

感谢所有参与者

这完全是我的错误和疏忽。我是从某个来源复制此代码部分的:

g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
在这里提问之前,我看不出我使用了与文本呈现相关的提示

特别感谢@Pshemo先生建议使用此渲染提示:

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
我在问之前就知道了,但我是一个人,一个小时都不知道哪里出了错,于是问


PS:对不起,我说的是英语

您不应该在paintComponent方法中更改状态,而应该在计时器中更改状态。绘画方法应该是单独绘画。此外,考虑创建一个图像集合,而不是重复地进行复杂的计算,简单地基于开始时计算的所有图像交换图像。@ HoVrCRAFTFulfFeeles在完整的代码中,我有两个定时器一个用于游戏状态蜱,另一个用于重新绘制。这个简单的示例仅用于示例,如果这个示例中有重要的内容,我可以将其分开..您是否尝试使用
g.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON)?@Pshemo谢谢您,先生,这是一个复制粘贴问题…谢谢您的关注,但我已经从评论中收到了正确的答案,我错误地使用了抗锯齿提示。@StrangerintheQ:您可以。@trashgood谢谢您就我自己的问题提出答案