我正在使用BlueJ作为IDE开发一个使用Java的简单平台游戏。现在我在游戏中使用多边形和简单形状绘制玩家/敌人精灵,平台和其他物品。最终我希望用实际图像替换它们。
现在我想知道将图像(URL或本地源)设置为我的游戏窗口/画布的“背景”的最简单的解决方案是什么?
如果它不是很长或很复杂,我会很感激,因为我的编程技巧不是很好,我希望尽可能保持我的程序。请提供带有注释的示例代码,以详细说明它们的功能,如果它在自己的类中,如何调用它在其他类上使用的相关方法。
非常感谢。
答案 0 :(得分:28)
答案会略有不同,具体取决于应用程序或小程序是使用AWT还是Swing。
(基本上,以J
开头的类,例如JApplet
和JFrame
是Swing,Applet
和Frame
是AWT。)
在任何一种情况下,基本步骤都是:
Image
对象中。Component
的绘画事件中绘制背景图像。 第1步。加载图片可以使用Toolkit
课程,也可以使用ImageIO
课程。
Toolkit.createImage
方法可用于从Image
中指定的位置加载String
:
Image img = Toolkit.getDefaultToolkit().createImage("background.jpg");
同样,可以使用ImageIO
:
Image img = ImageIO.read(new File("background.jpg");
第2步。需要覆盖应该获取背景的Component
的绘制方法,并将Image
绘制到组件上。
对于AWT,要覆盖的方法是paint
方法,并使用drawImage
方法传递给paint
方法的Graphics
方法:
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
方法,并使用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);
}
}
有关绘画的更多信息:
答案 1 :(得分: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
方法,方法与覆盖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图像格式,但也可以支持其他格式。即使这有助于在游戏中包含背景图像,但它并不完美!因为一旦你进入下一个级别,你所有的平台和精灵都是不可见的,所有你能看到的就是你的背景图像以及游戏中包含的任何JLabel / Jbuttons。
答案 2 :(得分:0)
或试试这个;)
try {
this.setContentPane(
new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
} catch (IOException e) {};
答案 3 :(得分:0)
<script>
function SetBack(dir) {
document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>
答案 4 :(得分:-1)
如果你真的是Java新手,那么你唯一需要担心的是Path。 您需要将图像拖动到主项目文件中,它将显示在列表的最底部。
然后文件路径非常简单。这段代码进入了类的构造函数。
img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg");
CS2是我的项目的名称,之前的所有内容都是通向工作区的。