【发布时间】:2017-06-12 04:18:52
【问题描述】:
谁能告诉我如何减慢精灵的外观以创建更流畅的动画?当我运行代码时,它会出现在 JPanel 中的最后一个(第 27 个)精灵。动画处理太快了!
有人告诉我关于 Swing Timer,但不幸的是我尝试了几次,但我无法让代码运行良好:(
这是我到目前为止的代码:
package sprites;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Sprites extends JFrame {
public static void main(String[] args) {
JFrame frm1 = new JFrame();
frm1.setSize(400, 400);
frm1.setLocationRelativeTo(null);
frm1.setResizable(false);
frm1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Painel1 pn1 = new Painel1();
frm1.getContentPane().add(pn1);
frm1.setVisible(true);
}
}
class Painel1 extends JPanel {
BufferedImage img;
public Painel1() {
setBackground(Color.yellow);
try
{
img = ImageIO.read(new File("images/dummy.png"));
}
catch (IOException e)
{}
}
@Override
public void paintComponent(Graphics g) {
int[][] spriteSheetCoords = {{8, 10, 119, 129},
{138, 10, 118, 130},
{267, 10, 118, 132},
{402, 11, 113, 132},
{538, 12, 106, 134},
{671, 13, 103, 133},
{804, 12, 102, 132},
{23, 161, 100, 134},
{157, 162, 96, 134},
{287, 159, 95, 135},
{418, 158, 95, 133},
{545, 159, 99, 133},
{673, 159, 102, 134},
{798, 158, 108, 130},
{9, 309, 116, 126},
{137, 309, 118, 127},
{274, 310, 110, 128},
{412, 311, 102, 129},
{541, 312, 103, 130},
{671, 312, 104, 131},
{806, 312, 98, 132},
{29, 463, 94, 135},
{155, 462, 98, 135},
{279, 461, 104, 135},
{409, 461, 106, 135},
{536, 461, 109, 135},
{662, 461, 112, 133}};
Image subSprite;
for (int i = 0; i <= 26; i++) {
super.paintComponent(g);
subSprite = img.getSubimage(spriteSheetCoords[i][0], spriteSheetCoords[i][1], spriteSheetCoords[i][2], spriteSheetCoords[i][3]);
g.drawImage(subSprite, 140, 120, null);
}
}
}
假设创建一个从第一个精灵到最后一个(第 27 个)精灵的循环。
【问题讨论】:
-
1)
img = ImageIO.read(new File("images/dummy.png"));应用程序资源将在部署时成为嵌入式资源,因此明智的做法是立即开始访问它们。 embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。 2)catch (IOException e) {}应该是catch (IOException e) { e.printStackTrace(); }3)public void paintComponent(Graphics g) { int[][] spriteSheetCoords因为这个方法.. -
.. 可能会被多次调用,在方法之外声明数组更有意义。 4)
for (int i = 0; i <= 26; i++) { super.paintComponent(g);调用super方法一次,循环中不会多次。 5)g.drawImage(subSprite, 140, 120, null);最好是g.drawImage(subSprite, 140, 120, this);,因为每个JComponent都是ImageObserver的一个实例。 6)作为一般性评论,您似乎在模糊地把代码语句扔在一起,希望某种组合能够奏效。这也被称为“魔法编码”,它永远不会奏效。弄清楚代码的含义。 -
“我只是没有太多 Java 知识” 好吧,@MadProgrammer 链接到本教程的两个部分,它们提供了 Java 知识。好好利用吧。
标签: java swing animation timer jpanel