Java Sprite 动画 - 似乎无法让我的 Sprite 正确重绘

标签 java swing animation canvas sprite

我一直在尝试使用 Java 制作一些 Sprite 动画并重绘它,但是我似乎无法让我的 Sprite 在 Canvas 上正确重绘。最初的问题是,当我重新绘制 Canvas 时,先前的帧仍然存在于 Canvas 的背景中,因此为了解决这个问题,我添加了对 .clearRect(); 的调用;然而,虽然添加对该函数的调用确实解决了该问题,但它导致我开始疯狂地丢失帧。我已经搜索并尝试了一些方法,但可以找到解决方案,并且据我所知,.clearRect() 有时会在 .drawImage() 之后执行。我的 Canvas 代码如下:

package rpg;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class Sprite extends Canvas{

    /**
     * 
     */
    private BufferedImage img;
    private static final long serialVersionUID = 1L;

    public Sprite(int width, int height, BufferedImage img){
        this.img = img;
        setSize(width, height);
    }
    @Override
    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D) g;
        g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
        g2d.drawImage(img, 0, 0, null);
        g2d.dispose();
    }

    @Override
    public void update(Graphics g) {
        paint(g);

     }

    public void changeSprite(BufferedImage img)
    {
        this.img = img;
        repaint();

    }





}

注意:我正在使用透明背景,并希望保持其透明。

最佳答案

At first the Problem was that the Previous frames were still there in the back ground of the Canvas when I re-drew it so in order to fix that I added a call to .clearRect();

不要使用clearRect()。相反,您应该使用 fillRect(...) 来绘制组件的背景颜色。

以下内容来自clearRect()方法的API:

从 Java 1.1 开始,屏幕外图像的背景颜色可能取决于系统。应用程序应使用 setColor,然后使用 fillRect,以确保将屏幕外图像清除为特定颜色。

但是,您甚至不需要这样做。当您重写绘画方法时,您需要调用 super.thePaintingMethod(...)。在这种情况下,您尝试重写 Paint() 方法,因此第一条语句应该是:

super.paint(g);

然后组件的默认绘制代码将为您绘制背景。

此外,这不是 Swing 绘画代码。这是 AWT 代码。您确实应该正确标记您的问题。我们不知道您是否真的尝试使用 Swing 技术进行绘画,或者您是否找到了旧的 AWT 绘画代码并假设它在 Swing 中是相同的。

I'm working with a transparent background

嗯...你为什么要尝试使用 AWT?你还没有限定你的问题。由于您尚未删除“Swing”标签,因此我假设您正在使用 Swing。

使用 Swing 代码将是:

JLabel sprite = new JLabel( new ImageIon(...) );

就是这样。一行代码。不需要自定义类。

要更改图像,您只需使用:

sprite.setIcon( new ImageIcon(...) );

关于Java Sprite 动画 - 似乎无法让我的 Sprite 正确重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358810/

相关文章:

c# - 团结麦克尼姆。如何在禁用游戏对象之前重置动画

objective-c - 使用 UIScrollView subview 调整 UIView 的大小

java - 更改基本 Java 动画中的颜色

java - 尝试使用 GTKLookAndFeel 在 JavaFX 中设置 SwingNode 的样式会卡住应用程序

java - 如何强制 JFrame 在移动时留在后台?

java - Back4App 或 Firebase 支持 Java 托管吗?

css - 将 Edge 动画转换为 CSS3

java - 增加 TextView 的值,例如0为点击值+1

java - System.out.println/System.err.println 不工作

java - 如何将 SynthLookAndFeel 与 xml 文件一起使用,其中 xml 文件路径将使用 getResourceAsStream 方法加载文件?