gpt4 book ai didi

java - Java Swing中实现 Sprite 的波动效果

转载 作者:行者123 更新时间:2023-12-02 13:38:02 24 4
gpt4 key购买 nike

在 Java swing 中是否有一种方法可以使 Sprite 具有现场效果?喜欢围绕其中心随机移动并产生波动效果吗?

我尝试了类似以下的方法(但结果很糟糕):

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);

}
}
}

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

最佳答案

简短的回答是肯定的,这是可以做到的。长的答案是,您永远找不到满足您确切需求的单个示例/解决方案,您需要剖析它们并删除您需要的那些元素。这是专业开发人员的标志,相信我,我花了 90% 的时间做我以前从未做过的事情(或者最初不知道如何完成)。

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

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

动画

动画只是随时间变化的幻觉。表面上看起来实现起来很简单,实际上变成very complex, very quickly

在 Swing 中,最简单的解决方案是使用 Swing Timer ,它生成定期更新,在事件调度线程的上下文中触发,从而可以安全地更新 UI(Swing 与大多数 UI 框架一样,不是线程安全的)。

由于其工作方式,它不是很精确,这意味着您最终可能会得到可变的帧速率。您可以使用 time based animation 来克服这个问题方法,其中移动基于持续时间,而不是计时器触发的次数。

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

转型

图形的变换(移动/旋转)最终取决于您要变换的“内容”。

Graphics2D API 能够旋转图像,for example , example , example , example , example , example .

它还可以旋转图形上下文本身,这可能会很困惑,或者旋转“形状”,这通常更容易管理。

您应该看看Working with GeometryTransforming Shapes, Text and Images2D Graphics一般来说。

您还可以在点之间移动对象并更改其方向,如 here 所示。和 here或者您可以使用path based animation以便对象遵循预定义的移动路径,甚至更复杂的路径,例如基于时间线的动画,for example , example , example

所以,长答案是,这取决于

关于java - Java Swing中实现 Sprite 的波动效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42886366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com