gpt4 book ai didi

Java:在其他动画 gif 上叠加/覆盖动画 gif

转载 作者:行者123 更新时间:2023-11-29 05:38:54 33 4
gpt4 key购买 nike

我正在制作一个小游戏。这不是 Action 游戏,而是解谜游戏,因此性能并不是那么重要。现在,我有了主游戏区,一张背景图片。在某些情况下,我想在部分背景图像上绘制其他图像。我的问题是背景图片和叠加的图片都可以是 gif 动画,帧数未知(基本上是用户选择的)。

现在,我想做的基本上是:绘制背景图像并使其具有动画效果(如果它是 gif),然后在其顶部绘制 0-n 个较小的动画 gif,相对于背景图像的位置,以像素为单位坐标。此外,它应该可以调整大小,以便图像相应地缩放/移动。

最终结果可能是这样的:http://i.stack.imgur.com/PxdDt.png (想象一下动画)

我找到了一个解决方案,它通过将布局管理器设置为 null 并使用绝对定位的 JLabels 和图标来使它们动画化,使用一个作为背景,另一个添加到它作为前景:

background.setSize(backgroundIcon.getIconWidth(), backgroundIcon.getIconHeight());
foreground.setSize(foregroundIcon.getIconWidth(), foregroundIcon.getIconHeight());
background.setLocation(0, 0);
foreground.setLocation(30, 30);
background.setLayout(null);
background.add(foreground);
frame.setLayout(null);
frame.add(background);

(完整代码如下)

据我所知,将布局管理器设置为空是有问题的(特别是因为我想稍后向图像添加一些文本,尽管我会在背景中使用另一个标签,而不是背景标签本身或其他东西),并且调整大小似乎不可能这样,因为我无法调整 JLabels 图像图标的大小(找到了一些解决方案,将 gif 拆分为每层一个 bufferedImage 并在将它们重新组合在一起之前调整它们的大小,通过它它会丢失帧之间的特定延迟等)。此外,由于位置应该是像素完美的,因此即使可能调整大小也可能会因舍入误差而出现问题。

现在,有没有更好的方法来做到这一点?我可以以某种方式加载动画 gif 并手动合并它们(即使它们可能具有不同的层数)所以我只需要绘制一个图像吗?是否有一个布局管理器,我可以在其中手动设置组件位置,但如果您调整窗口/面板大小时它会自动缩放它?是否有第三方图形项目可以立即执行我想要的操作?

理想情况下,如果它们不是动画,我会做的事情,比如构建一个合并的图像,然后调整大小并显示该图像。

完整代码:

import java.awt.Dimension;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public final class Tester extends JFrame {
public static void main(String[] args) throws MalformedURLException {
new Tester();
}

private Tester() throws MalformedURLException {
setTitle("Tester");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Icon backgroundIcon = new ImageIcon(new URL("http://s5.favim.com/orig/51/animated-gif-gif-hands-sign-language-Favim.com-542945.gif"));
Icon foregroundIcon = new ImageIcon(new URL("http://i.imgur.com/89HANHg.gif"));

JLabel background = new JLabel(backgroundIcon);
JLabel foreground = new JLabel(foregroundIcon);

// ugly
background.setSize(backgroundIcon.getIconWidth(), backgroundIcon.getIconHeight());
foreground.setSize(foregroundIcon.getIconWidth(), foregroundIcon.getIconHeight());
background.setLocation(0, 0);
foreground.setLocation(30, 30);
background.setLayout(null);
background.add(foreground);
setLayout(null);
add(background);

// set size of frame to size of content
setResizable(false);
getContentPane().setPreferredSize(new Dimension(backgroundIcon.getIconWidth(), backgroundIcon.getIconHeight()));
pack();

setLocationRelativeTo(null);
setVisible(true);
}
}

最佳答案

这对我有用。较小的轨道图像位于较大的月相图像的中央。

import java.awt.*;
import javax.swing.*;
import java.net.*;

public final class Tester extends JFrame {
public static void main(String[] args) throws MalformedURLException {
new Tester();
}

private Tester() throws MalformedURLException {
setTitle("Tester");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Icon backgroundIcon = new ImageIcon(
new URL("http://1point1c.org/gif/moon/moonphases.gif"));
Icon foregroundIcon = new ImageIcon(
new URL("http://1point1c.org/gif/thum/plnttm.gif"));

JLabel background = new JLabel(backgroundIcon);
JLabel foreground = new JLabel(foregroundIcon);

background.setLayout(new GridBagLayout());
background.add(foreground);
add(background);

pack();

setLocationByPlatform(true);
setVisible(true);
}
}

关于Java:在其他动画 gif 上叠加/覆盖动画 gif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433243/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com