我正在使用 BlueJ 作为 IDE 使用 Java 开发一个简单的平台游戏。现在,我在游戏中使用多边形和简单形状绘制了玩家/敌人精灵、平台和其他项目。最终我希望用实际图像替换它们。
现在我想知道将图像(URL 或来自本地源)设置为我的游戏窗口/画布的“背景”的最简单解决方案是什么?
如果它不是很长或不太复杂,我将不胜感激,因为我的编程技能不是很好,我想让我的程序尽可能简单。请提供带有注释的示例代码来详细说明它们的功能,如果它在它自己的类中,如何调用它在其他类中使用的相关方法。
非常感谢你。
我正在使用 BlueJ 作为 IDE 使用 Java 开发一个简单的平台游戏。现在,我在游戏中使用多边形和简单形状绘制了玩家/敌人精灵、平台和其他项目。最终我希望用实际图像替换它们。
现在我想知道将图像(URL 或来自本地源)设置为我的游戏窗口/画布的“背景”的最简单解决方案是什么?
如果它不是很长或不太复杂,我将不胜感激,因为我的编程技能不是很好,我想让我的程序尽可能简单。请提供带有注释的示例代码来详细说明它们的功能,如果它在它自己的类中,如何调用它在其他类中使用的相关方法。
非常感谢你。
根据应用程序或小程序使用的是AWT还是Swing,答案会略有不同。
(基本上,以和开头的类J是Swing,和是 AWT。)JAppletJFrameAppletFrame
无论哪种情况,基本步骤都是:
Image对象中。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);
}
}
有关绘画的更多信息:
首先创建一个扩展类的新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。
或者试试这个;)
try {
this.setContentPane(
new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
} catch (IOException e) {};
如果您真的是 Java 新手,那么路径是您真正需要担心的唯一事情。您需要将图像拖到主项目文件中,它将显示在列表的最底部。
然后文件路径非常简单。此代码进入类的构造函数。
img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg");
CS2 是我的项目的名称,之前的所有内容都指向工作区。
<script>
function SetBack(dir) {
document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>