如何在Java中设置背景图像?

2022-09-02 01:25:38

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

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

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

谢谢。


答案 1

答案会略有不同,具体取决于应用程序或小程序使用的是AWT还是Swing

(基本上,以 和 开头的类是 Swing,并且是 AWT。JJAppletJFrameAppletFrame

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

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

步骤 1.可以使用 Toolkit 类或 ImageIO 类加载映像。

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

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

类似地,可以使用:ImageIO

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

步骤2.应该获取背景的绘画方法需要被覆盖,并将其绘制到组件上。ComponentImage

对于 AWT,要重写的方法是绘制方法,并使用传递给该方法的 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 中执行的操作绘制 as。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);
    }
}

有关绘画的更多信息:


答案 2

首先创建一个扩展该类的新类。我打电话给我的新班级。因此,在这个新类中,导入所有 Java 包,以便重写该方法。这应该是:WorldViewBackgroundpaintBackground

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;

接下来,在类名之后,确保它显示 extends 。像这样:WorldView

public class Background extends WorldView

然后声明类型的变量游戏和类型如下类型的图像变量:GameImage

private Game game;
private Image image;

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

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

然后,只需以与在类中重写方法时完全相同的方式重写该方法即可。就像这样:paintBackgroundpaintPlayer

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

现在,最后,您必须声明对刚刚在类中创建的新类的类级别引用,并在构造函数中对其进行初始化,如下所示:GameGame

private Background image;

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

最后,您所要做的就是将背景添加到框架中!这就是我确信我们都错过了的事情。为此,您必须在声明变量后执行如下操作:frame

frame.add(image);

请确保在 之前添加此代码。另外,请确保您使用的背景图像不是太大!frame.pack();

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


推荐