java - 行走动画

标签 java loops animation bufferedimage

所以我一直在查看 Notch 的 Metagun 源代码,但我似乎无法弄清楚他是如何让 Sprite 动画的。现在我要做的就是循环播放角色行走动画的一些图像。这是代码,到目前为止,我的输出只显示了第一个走路的图像,即静止不动的角色: 封装动画;

import java.awt.*;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class SpriteAnimation extends JComponent{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    int frame=0;
    public void paint(Graphics g){
        try{
        BufferedImage still = ImageIO.read(SpriteAnimation.class.getResource("still.png"));
        BufferedImage walkRight = ImageIO.read(SpriteAnimation.class.getResource("right.png"));
        BufferedImage midWalk = ImageIO.read(SpriteAnimation.class.getResource("mid.png"));
        BufferedImage walkLeft = ImageIO.read(SpriteAnimation.class.getResource("left.png"));
        BufferedImage[] states={still,walkRight,midWalk};       
        int frame=0;
        do{
            frame++;
            if(frame>=3){
                frame=0;
                g.drawImage(states[frame],0,0,null);
            }
        }
        while(true);
        }catch(Exception e){

        }
    }


}

最佳答案

我不知道为什么其他人继续尝试重构你的代码,甚至没有在这里提到真正的问题:如果你使用 Swing 来制作你的动画,那个循环在那里是一个很大的不不。这样做基本上是在占用 EDT 并拖延整个 GUI。

您应该重写您的代码,以便每次调用 paint 方法时,您的 SpriteAnimation 只绘制一帧,同时管理动画循环由某种计时器外部控制。

简单示例:

public class SpriteAnimation extends JComponent{
    private int currentFrame = 0;
    private BufferedImage[] frames;

    public SpriteAnimation(){
        /**
         * Load your frames
         */
    }

    public void paintComponent(Graphics g){
        currentFrame++;
        if(frame >= 3)
            frame = 0;

        // we pass this as the ImageObserver in case the images are 
        // loaded asynchronously
        g.drawImage(frames[currentFrame], 0, 0, this);                
    }
}

在你的主要方法中:

// Timer is a swing timer
Timer timer = new Timer(
    100, 
    new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            // main frame is your main animation canvas (eg a JFrame)
            mainFrame.repaint();
        }
    });
timer.start();

关于java - 行走动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797799/

相关文章:

java - Android ActionBar 找不到资源

python - 如何通过遍历整数和字符串的组合来创建变量?

Java:如果另一个 int 尚不存在则定义 int

java - 使用多线程更新GUI

java - 使用 Java 更新 elasticsearch 中的多个文档。我正在使用 Elasticsearch 2.3.2

java - 执行的程序挂起(可能是由于输出太多)

Java字符比较错误

android - 如何访问回收站 View 中项目的查看器?

java - 如何从随机数系列中排除某个数字?

java - JTabbedPane - 选项卡更改后聚焦最后一个聚焦组件