Sprite动画计时java swing
我尝试使用Swing在JAVA中制作精灵动画。下面的代码是一个ImageIcon数组,为了显示几个不同的图像,我将对其进行迭代(仅2个用于测试目的)。 但我不知道如何正确地计算每次迭代的时间。我的意思是,当我编译我正在处理的标签代码时,只显示数组的最后一个图像(很明显),但我希望它显示一些ms的第一个图像,然后显示另一个。 我做了一些研究,看到了一些关于时间类的建议,但我真的不知道如何在这些环境中实现它。我还尝试使用睡眠,它在C++中运行良好,但只出现了thule.睡觉,在这种情况下不起作用。p> 该动画应该模拟一张正在翻转的扑克牌(用于垄断游戏) 有人能就这件事给我一些意见吗Sprite动画计时java swing,java,swing,animation,sprite,animated-gif,Java,Swing,Animation,Sprite,Animated Gif,我尝试使用Swing在JAVA中制作精灵动画。下面的代码是一个ImageIcon数组,为了显示几个不同的图像,我将对其进行迭代(仅2个用于测试目的)。 但我不知道如何正确地计算每次迭代的时间。我的意思是,当我编译我正在处理的标签代码时,只显示数组的最后一个图像(很明显),但我希望它显示一些ms的第一个图像,然后显示另一个。 我做了一些研究,看到了一些关于时间类的建议,但我真的不知道如何在这些环境中实现它。我还尝试使用睡眠,它在C++中运行良好,但只出现了thule.睡觉,在这种情况下不起作用。p
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class Sprite2 {
private ImageIcon[] sprites;
private ImageIcon a = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
private ImageIcon b = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
public Sprite2() {
sprites = new ImageIcon[] {a, b};
}
public void render(JLabel lbl) {
for (int i = 0; i < sprites.length; i++) {
lbl.setIcon(sprites[i]);
//sleep(1000); - Looking for a similar Java function which is able to delay each iteration and make it look like a gif
}
}
import javax.swing.ImageIcon;
导入javax.swing.JLabel;
公共类精神2{
私有图像图标[]精灵;
private ImageIcon a=新的ImageIcon(“C:/Users/Guilherme/Desktop/G/FEUP/2ºAno/第二学期/Eclipse repos/Sprite/src/images/ball.jpg”);
private ImageIcon b=新的ImageIcon(“C:/Users/Guilherme/Desktop/G/FEUP/2ºAno/2nd-sement/Eclipse repos/Sprite/src/images/transferir.jpg”);
公共精神2(){
精灵=新的图像图标[]{a,b};
}
公共无效渲染(JLabel lbl){
for(int i=0;i
您可以使用Swing定时器,有关详细信息,请参阅
您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。您可以使用Swing timer,请参阅以获取更多详细信息
您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。您可以使用Swing timer,请参阅以获取更多详细信息
您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。您可以使用Swing timer,请参阅以获取更多详细信息
您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。我使用计时器解决了这个问题
由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像
import java.awt.Graphics;
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.JPanel;
import javax.swing.Timer;
public class Sprite extends JPanel implements ActionListener{
private ImageIcon[] sprites = new ImageIcon[4];
private Timer time;
private int delay = 500, currentFrame = 0;
private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");
public Sprite() {
sprites[0] = a0;
sprites[1] = a0;
sprites[2] = a1;
sprites[3] = a2;
time = new Timer(delay, this);
time.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
sprites[currentFrame].paintIcon(this, g, 0, 0);
if (currentFrame == sprites.length-1) {
time.stop();
}
else currentFrame++;
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] arg) {
JFrame f = new JFrame();
Sprite s = new Sprite();
f.add(s);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
}
}
我是用定时器算出的 由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像
import java.awt.Graphics;
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.JPanel;
import javax.swing.Timer;
public class Sprite extends JPanel implements ActionListener{
private ImageIcon[] sprites = new ImageIcon[4];
private Timer time;
private int delay = 500, currentFrame = 0;
private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");
public Sprite() {
sprites[0] = a0;
sprites[1] = a0;
sprites[2] = a1;
sprites[3] = a2;
time = new Timer(delay, this);
time.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
sprites[currentFrame].paintIcon(this, g, 0, 0);
if (currentFrame == sprites.length-1) {
time.stop();
}
else currentFrame++;
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] arg) {
JFrame f = new JFrame();
Sprite s = new Sprite();
f.add(s);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
}
}
我是用定时器算出的 由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像
import java.awt.Graphics;
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.JPanel;
import javax.swing.Timer;
public class Sprite extends JPanel implements ActionListener{
private ImageIcon[] sprites = new ImageIcon[4];
private Timer time;
private int delay = 500, currentFrame = 0;
private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");
public Sprite() {
sprites[0] = a0;
sprites[1] = a0;
sprites[2] = a1;
sprites[3] = a2;
time = new Timer(delay, this);
time.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
sprites[currentFrame].paintIcon(this, g, 0, 0);
if (currentFrame == sprites.length-1) {
time.stop();
}
else currentFrame++;
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] arg) {
JFrame f = new JFrame();
Sprite s = new Sprite();
f.add(s);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
}
}
我是用定时器算出的 由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像
import java.awt.Graphics;
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.JPanel;
import javax.swing.Timer;
public class Sprite extends JPanel implements ActionListener{
private ImageIcon[] sprites = new ImageIcon[4];
private Timer time;
private int delay = 500, currentFrame = 0;
private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");
public Sprite() {
sprites[0] = a0;
sprites[1] = a0;
sprites[2] = a1;
sprites[3] = a2;
time = new Timer(delay, this);
time.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
sprites[currentFrame].paintIcon(this, g, 0, 0);
if (currentFrame == sprites.length-1) {
time.stop();
}
else currentFrame++;
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] arg) {
JFrame f = new JFrame();
Sprite s = new Sprite();
f.add(s);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
}
}