当前位置: 首页 > 知识库问答 >
问题:

在Java Swing中实现sprite的波动效果

霍锦
2023-03-14
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Main extends JFrame {

    private static final int W = 800;
    private static final int H = 400;
    private int last = -1;

    public Main() {
        super("JFrame");
        this.add(new ImagePanel());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        setSize(W, H);
        this.setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Main();
            }
        });
    }

    class ImagePanel extends JPanel {

        Timer movementTimer;
        int x, y;

        public ImagePanel() {
            x = 58;
            y = 58;
            movementTimer = new Timer(12, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    moveImage();
                    repaint();
                }
            });
            movementTimer.start();
        }

        public void moveImage() {
            if (last < 0) {
                last = random();
                x += last;
                y += last;
            } else {
                x -= last;
                y -= last;
                last = -1;
            }
            if (x > W) {
                x = 0;
            }
            if (y > H) {
                y = 0;
            }
        }

        private int random() {

            Random r = new Random();
            int Low = 2;
            int High = 14;
            int Result = r.nextInt(High - Low) + Low;
            return Result;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            long start = System.nanoTime();
            g.setColor(Color.RED);
            g.fillRect(0, 0, W, H);
            g.setColor(Color.BLUE);
            g.fillRect(x, y, 50, 50);

        }
    }
}

结果一点都不顺利,你有什么建议吗?

共有1个答案

束俊英
2023-03-14

简短的回答是肯定的,这是可以做到的。长期的答案是,您永远不会找到一个单一的例子/解决方案来满足您的确切需求,您将需要剖析它们并删除那些您需要的元素。这是一个专业开发人员的标志,相信我,我90%的时间都在做我以前从未做过的事情(或者对如何完成没有初步想法)。

当提出一个问题/想法时,您需要后退一步,将其分解为可管理的组件

从我的角度来看,你有两个基本要求,动画和转换。

另一个解决方案是使用一个线程,计算每个更新周期所需的时间,并等待维护FPS所需的剩余时间。当您遇到线程问题(脏更新)时,这将变得更加复杂,而且它没有考虑在UI上实际呈现图形可能需要的时间(当使用Swing的被动呈现引擎时)

转换图形(移动/旋转)最终将归结为您正在转换的“什么”。

graphics2dAPI具有旋转图像的能力,例如,example,example,example,example,example,example,example。

它还可以旋转图形上下文本身,这可能是混乱的,或者旋转“形状”,这通常更容易管理。

你应该看看如何处理几何和转换形状、文本和图像以及一般的2D图形。

您还可以在点之间移动对象并改变它们的排列,如这里和这里所演示的,或者您可以使用基于路径的动画,以便对象遵循预定义的移动路径,或者更复杂的东西,如基于时间线的动画,例如,示例,示例

 类似资料:
  • 本文向大家介绍iOS 水波纹动画的实现效果,包括了iOS 水波纹动画的实现效果的使用技巧和注意事项,需要的朋友参考一下 本人最近在研究iOS动画,至于原理,我不在这里说了。毕竟这里的标题:水波纹的实现。 在这里,要学习水波纹的实现,首先要知道以下几点知识: 1.正弦函数:y = Asin(wx +b) + c。相信大家都比较熟悉。 2.CAShapeLayer的简单实用,相信看一下,就是知道其大概

  • 本文向大家介绍Android WaveView实现水流波动效果,包括了Android WaveView实现水流波动效果的使用技巧和注意事项,需要的朋友参考一下    水流波动的波形都是三角波,曲线是正余弦曲线,但是Android中没有提供绘制正余弦曲线的API,好在Path类有个绘制贝塞尔曲线的方法quadTo,绘制出来的是2阶的贝塞尔曲线,要想实现波动效果,只能用它来绘制Path曲线。待会儿再讲

  • 本文向大家介绍Unity shader实现顶点动画波动效果,包括了Unity shader实现顶点动画波动效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Unity shader实现顶点动画的具体代码,供大家参考,具体内容如下 需要了解的背景知识: 波动实例:y=  Asin(ωx+φ) φ:决定波形与X轴位置关系或横向移动距离(左加右减) ω:决定周期(最小正周期T=2Π/|ω

  • 本文向大家介绍iOS实现波浪效果,包括了iOS实现波浪效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了iOS实现波浪效果的具体代码,供大家参考,具体内容如下 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Android实现水波纹效果,包括了Android实现水波纹效果的使用技巧和注意事项,需要的朋友参考一下 一、效果   点击开始:   点击停止: 二、在MainActivity中 三、在activity_main中 四、在WaveView中: 五、在CircleImageView中: 六、在attrs中 以上所述是小编给大家介绍的Android实现水波纹效果,希望对大家有所帮助,如

  • 本文向大家介绍Android实现水波纹特效,包括了Android实现水波纹特效的使用技巧和注意事项,需要的朋友参考一下 最近需要做个类似于水波纹动画的效果,思考了一下不需要UI切个动态图,Android原生的技术利用动画或者自定义控件都可以实现,下面上个图类似于这样的效果 下面请看第一种动画实现,这种方式较为简单些,就是利用3个ImageView不断地做缩放和渐变的动画。 布局文件定义一下 接下来