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

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

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

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

非常感谢你。

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

(基本上,以J开头的类如JAppletJFrame是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方法,并使用传递给paint方法的Graphics对象的drawImage方法:

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

有关绘画的更多信息:

  • 在AWT和Swing中绘画
  • 课程:从Java教程 执行自定义绘画可能会有所帮助。

首先创建一个扩展WorldView类的新类。 我打电话给我的新class级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类型的Game是构造函数的签名,并且在调用super你必须初始化WorldView ,初始化游戏并初始化图像变量,如下所示:

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

然后,您只需覆盖paintBackground方法,就像覆盖Player类中的paint方法时一样。 像这样:

 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();之前添加此代码frame.pack(); 。 还要确保使用不太大的背景图像!

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

或试试这个;)

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

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

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

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

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