22

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

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

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

非常感谢你。

4

5 回答 5

31

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

(基本上,以和开头的类J是Swing,和是 A​​WT。)JAppletJFrameAppletFrame

无论哪种情况,基本步骤都是:

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

Step 1.加载图片可以是使用Toolkit类,也可以是ImageIO类。

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

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

同样,ImageIO可以使用:

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

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

对于 AWT 来说,要覆盖的方法就是paint方法,并使用传递给drawImage方法的Graphics对象的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,要覆盖的方法是 的paintComponent方法JComponent,并绘制Image与在 AWT 中所做的一样的方法。

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);
    }
}

有关绘画的更多信息:

于 2009-02-07T14:08:59.503 回答
1

首先创建一个扩展类的新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;

接下来在类名之后确保它说 extends WorldView。像这样的东西:

public class Background extends WorldView

然后声明变量 game 类型Game和一个 image 类型变量,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();

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

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。

于 2009-03-03T19:50:14.613 回答
0

或者试试这个;)

try {
  this.setContentPane(
    new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
} catch (IOException e) {};
于 2012-04-04T21:33:08.477 回答
-1

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

然后文件路径非常简单。此代码进入类的构造函数。

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

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

于 2012-04-26T01:56:14.960 回答
-1
<script>
function SetBack(dir) {
    document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>
于 2019-04-01T14:21:28.477 回答