如何在Java中设置背景图像?
我正在使用BlueJ作为IDE开发一个使用Java的简单平台游戏。 现在我在游戏中使用多边形和简单形状绘制了玩家/敌人精灵,平台和其他物品。 最终我希望用实际图像替换它们。
现在我想知道将图像(URL或本地源)设置为我的游戏窗口/canvas的“背景”的最简单的解决方案是什么?
如果它不是很长或很复杂,我会很感激,因为我的编程技巧不是很好,我想让我的程序尽可能简单。 请提供带有注释的示例代码以详细说明其function,如果它在自己的类中,则如何调用其在其他类上使用的相关方法。
非常感谢你。
根据应用程序或小程序是使用AWT还是Swing ,答案会略有不同。
(基本上,以J
开头的类如JApplet
和JFrame
是Swing,而Applet
和Frame
是AWT。)
无论哪种情况,基本步骤都是:
- 将图像绘制或加载到
Image
对象中。 - 在要绘制背景的
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,要覆盖的方法是JComponent
的paintComponent
方法,并像在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是我的项目的名称,之前的所有内容都是通向工作区的。