我试图为我的游戏制作一个精灵来制作动画,然后将它加载到背景上的JFrame中,但它不会改变到我动画的下一帧有没有人知道如何解决这个问题?如果这是一个简单的错误,我很抱歉,但我是java新手。
我的主要课程
package com.projectelrond.main;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import com.projectelrond.Sprites.Ranger;
public class Main extends JFrame{
private static final long serialVersionUID = 1L;
public int WIDTH = 160, HEIGHT = WIDTH/12 *9, SCALE = 3, X = 10, Y = 10;
public boolean running = false;
JFrame f = new JFrame("name");
BackGround bg = new BackGround();
JLabel BackGround = new JLabel(new ImageIcon(bg.Bg));
Ranger R = new Ranger();
JLabel Ranger = new JLabel(R.RangerA[R.I]);
public static void main(String[] args) {
new Main();
}
public Main() {
Ranger.setSize(Ranger.getPreferredSize());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(WIDTH * SCALE, HEIGHT * SCALE);
f.setResizable(false);
running = true;
BackGround.add(Ranger);
f.add(BackGround);
f.setVisible(true);
run();
}
public void run() {
while (running) {
Render();
}
}
public void Render() {
Ranger.repaint();
}
}
我的游侠类(我试图让它变为动画)
package com.projectelrond.Sprites;
import java.awt.Graphics;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.Timer;
public class Ranger extends JLabel implements ActionListener {
private static final long serialVersionUID = 1L;
public int X, Y, I = 0, TotalImages = 2;
public BufferedImage Ranger1, Ranger2;
public ImageIcon RangerA[];
private Timer RTimer;
public Ranger() {
try {
Ranger1 = ImageIO.read(getClass().getResource("/Images/Sprites/Ranger" + 0 + ".png"));
Ranger2 = ImageIO.read(getClass().getResource("/Images/Sprites/Ranger" + 1 + ".png"));
} catch (IOException e) {
e.printStackTrace();
}
Array();
}
public void Array() {
RangerA = new ImageIcon[TotalImages]; {
RangerA[0] = new ImageIcon(Ranger1);
RangerA[1] = new ImageIcon(Ranger2);
}
startAnimation();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (RangerA[I].getImageLoadStatus() == MediaTracker.COMPLETE) {
RangerA[I].paintIcon(this, g, 0, 0);
I = (I + 1) % TotalImages;
}
}
public void startAnimation() {
if (RTimer == null) {
I = 0;
RTimer = new Timer(100, this);
RTimer.start();
} else if (!RTimer.isRunning()) {
RTimer.restart();
}
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
}
答案 0 :(得分:2)
变量名称不应以大写字符开头。方法名称不应以大写字符开头。您使用的任何教科书或您找到的教程都将遵循Java命名约定。不要自己做。
不要扩展JLabel。没有必要做自定义绘画。您要做的就是切换图标并让标签绘制图标本身。
所以一种方法是为你的Timer创建一个类。创建类时,可以传入JLabel和图标数组。然后这个类将启动Timer并更改Array的索引,最后只需使用正确的Icon调用label.setIcon(...)。所以基本上你的Ranger类只会实现Timer的ActionListener。
对于略有不同的方法,您可以查看Animated Icon。此解决方案创建一个自定义图标,可以切换图标本身。所以你只需将Icon添加到标签上。