2009-02-07 119 views
21

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

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

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

非常感谢。

回答

27

根据应用程序或小应用程序是否使用AWTSwing,答案会有所不同。

(基本上,与JJAppletJFrame是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. 
    // .... 
} 

回转,要覆盖的方法是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); 
    } 
} 

欲了解更多关于绘画:

+0

谢谢你的回答。我有一些问题 - 1.有关图像应放在哪里?你可以给我一个图像的源代码路径,因为我不确定它应该如何布局。 – Dew 2009-02-08 00:55:01

+0

2.说如果我使用上面的代码创建一个名为'Background'的类,我需要在我的'Game'类(控制视图,游戏窗口的大小)中调用从Background类到使背景图像出现?请举个例子。 – Dew 2009-02-08 00:58:47

+0

这里是我目前使用的代码来设置我的游戏窗口的背景颜色 - view = new WorldView(world,width,height); view.setBackground(new Color(230,245,255)); – Dew 2009-02-08 00:59:28

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; 

接下来在类名后确保它说延伸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(); 

然后,您只需重写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();之前添加此代码。 另外请确保您使用的背景图像不是太大!

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

0

或者试试这个;)

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

路径是你真的不用担心,如果你真的对Java的唯一的事情。 您需要将图像拖放到主项目文件中,并将显示在列表的最底部。

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

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

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