【问题标题】:How to set background image in Java?如何在 Java 中设置背景图像?
【发布时间】:2010-10-06 03:27:00
【问题描述】:

我正在使用 Java 开发一个简单的平台游戏,并使用 BlueJ 作为 IDE。现在,我在游戏中使用多边形和简单形状绘制了玩家/敌人精灵、平台和其他项目。最终我希望用实际图像替换它们。

现在我想知道将图像(URL 或来自本地源)设置为我的游戏窗口/画布的“背景”的最简单解决方案是什么?

如果它不是很长或很复杂,我将不胜感激,因为我的编程技能不是很好,我想让我的程序尽可能简单。请提供带有cmets的示例代码,详细说明它们的功能,如果它在它自己的类中,如何调用它在其他类中使用的相关方法。

非常感谢。

【问题讨论】:

    标签: java image background set


    【解决方案1】:

    根据应用程序或小程序使用的是AWT 还是Swing,答案会略有不同。

    (基本上JAppletJFrameJ开头的类是Swing,AppletFrame是AWT。)

    在任何一种情况下,基本步骤都是:

    1. Image 对象中绘制或加载图像。
    2. 在你要绘制背景的Component的绘画事件中绘制背景图片。

    第 1 步。 可以使用 Toolkit 类或 ImageIO 类加载图像。

    Toolkit.createImage 方法可用于从String 中指定的位置加载Image

    Image img = Toolkit.getDefaultToolkit().createImage("background.jpg");
    

    同样可以使用ImageIO

    Image img = ImageIO.read(new File("background.jpg");
    

    第 2 步。 需要覆盖应获取背景的 Component 的绘制方法并将 Image 绘制到组件上。

    对于AWT,要覆盖的方法是paint方法,并使用Graphics对象的drawImage方法传入paint方法:

    public void paint(Graphics g)
    {
        // Draw the previously loaded image to Component.
        g.drawImage(img, 0, 0, null);
    
        // Draw sprites, and other things.
        // ....
    }
    

    对于 Swing,覆盖的方法是 JComponentpaintComponent 方法,并像在 AWT 中所做的那样绘制 Image

    public void paintComponent(Graphics g)
    {
        // Draw the previously loaded image to Component.
        g.drawImage(img, 0, 0, null);
    
        // Draw sprites, and other things.
        // ....
    }
    

    简单组件示例

    这是一个Panel,它在实例化时加载一个图像文件,并在其自身上绘制该图像:

    class BackgroundPanel extends Panel
    {
        // The Image to store the background image in.
        Image img;
        public BackgroundPanel()
        {
            // Loads the background image and stores in img object.
            img = Toolkit.getDefaultToolkit().createImage("background.jpg");
        }
    
        public void paint(Graphics g)
        {
            // Draws the img to the BackgroundPanel.
            g.drawImage(img, 0, 0, null);
        }
    }
    

    有关绘画的更多信息:

    【讨论】:

    • 感谢您的回答。我有一些问题- 1. 相关图像应该放在哪里?您能否提供一个图像的示例源路径,因为我不确定它应该如何布局。
    • 2.假设我使用上面的代码创建了一个名为“Background”的类,我需要在我的“Game”类(控制视图、游戏窗口的大小)中从 Background 类调用什么方法来制作背景图像出现?请举个例子。
    • 这是我目前用来设置游戏窗口背景颜色的代码- view = new WorldView(world, width, height); view.setBackground(新颜色(230, 245, 255));
    • 这些问题更多地与设计有关,而不是背景图像的实际绘画。您可能想要发布另一个包含相关信息的问题,或者从某个论坛寻求更多对话类型的帮助。
    • 不要忘记在绘画方法开始时调用super.paintXXX(g)
    【解决方案2】:

    首先创建一个扩展WorldView 类的新类。我打电话给我的新班级Background。因此,在这个新类中导入您需要的所有 Java 包,以覆盖 paintBackground 方法。这应该是:

    import city.soi.platform.*;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.ImageObserver;
    import javax.swing.ImageIcon;
    import java.awt.geom.AffineTransform;
    

    在类名之后确保它显示扩展WorldView。像这样的:

    public class Background extends WorldView
    

    然后声明Game 类型的变量游戏和Image 类型的图像变量,如下所示:

    private Game game;
    private Image image;
    

    然后在此类的构造函数中确保Game 类型的游戏在构造函数的签名中,并且在对super 的调用中,您必须初始化WorldView,初始化游戏并初始化图像变量,如下所示:

    super(game.getCurrentLevel().getWorld(), game.getWidth(), game.getHeight());
    this.game = game;
    bg = (new ImageIcon("lol.png")).getImage();
    

    然后,您只需以与在 Player 类中覆盖 paint 方法时完全相同的方式覆盖 paintBackground 方法。就像这样:

    public void paintBackground(Graphics2D g)
    {
    float x = getX();
    float y = getY();
    AffineTransform transform = AffineTransform.getTranslateInstance(x,y);
    g.drawImage(bg, transform, game.getView());
    }
    

    现在最后你必须声明一个对你刚刚在Game类中创建的新类的类级引用,并在Game构造函数中初始化它,如下所示:

    private Background image;
    
    And in the Game constructor:
    image = new Background(this);
    

    最后,您要做的就是将背景添加到框架中!这就是我确定我们都缺少的东西。为此,您必须在声明变量 frame 后执行以下操作:

    frame.add(image);
    

    确保在frame.pack(); 之前添加此代码。 还要确保使用不太大的背景图片!

    现在就是这样!我注意到游戏引擎可以处理 JPEG 和 PNG 图像格式,但也可以支持其他格式。尽管这有助于在您的游戏中包含背景图像,但它并不完美!因为一旦你进入下一个级别,你的所有平台和精灵都是不可见的,你所能看到的只是你的背景图像和你在游戏中包含的任何 JLabels/Jbuttons。

    【讨论】:

      【解决方案3】:

      或者试试这个;)

      try {
        this.setContentPane(
          new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
      } catch (IOException e) {};
      

      【讨论】:

        【解决方案4】:

        如果您真的是 Java 新手,那么路径是您真正需要担心的唯一事情。 您需要将图像拖到主项目文件中,它将显示在列表的最底部。

        那么文件路径就很简单了。此代码进入类的构造函数。

            img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg");
        

        CS2 是我的项目的名称,之前的所有内容都指向工作区。

        【讨论】:

        • 问题是如何将图像显示为背景,而不是如何从文件中加载图像。
        • 实际上,@userunknown,如何从文件中加载图像绝对是 OP 困惑的问题的一部分。
        【解决方案5】:
        <script>
        function SetBack(dir) {
            document.getElementById('body').style.backgroundImage=dir;
        }
        SetBack('url(myniftybg.gif)');
        </script>
        

        【讨论】:

        • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,但如果解释它是如何/为什么这样做的,答案会更好。请记住,您的答案不仅适用于提出问题的用户,还适用于所有其他找到该问题的人。
        猜你喜欢
        • 1970-01-01
        • 2012-08-04
        • 2013-03-07
        • 2021-08-07
        • 2018-01-08
        • 1970-01-01
        • 2022-10-07
        • 1970-01-01
        • 2021-10-05
        相关资源
        最近更新 更多