所以最近我决定尝试制作某种形式的精灵游戏,类似于较旧的最终幻想游戏。我主要将此作为代码学习过程,而不是使用像RPGMaker这样的东西来实际创建一个想法。
我最关心的是如何以简单的方式正确地绘制多层图像(例如静态精灵,背景图像等)。虽然我通常只是测试一堆东西而不是询问,但我意识到有很多(可能很简单的)方法可以在编码中实现任何一件事。
实现此目的有哪些方法(或类)?最好是一种容易改变哪些层位的方式(B前面的A层......哦,不要在A前面等待B!)
我希望这不是一个问题......
感谢。
答案 0 :(得分:1)
最基本的方法是painter's algorithm,只需按照与屏幕距离的相反顺序绘制图层(第一个背景,然后是字符,然后是前景)。
每个图层都由一个简单的类表示,如:
public class Layer
{
List<Sprite> sprites;
public void draw(Graphics g)
{
for (Sprite sprite : sprites)
sprite.draw(g);
}
}
精灵将是:
public class Sprite
{
BufferedImage image;
float x, y, w, h;
public void draw(Graphics g)
{
g.drawImage(image, (int)x, (int)y, (int)(x+w), (int)(y+h), 0, 0, image.getWidth(), image.getHeight(), null);
}
}
这里,背景将是一个具有单个精灵的图层,该精灵是屏幕的大小。您可以对背景图层进行子类化以实现像视差这样的效果。
最后,您的图层将成为场景的一部分:
public class Scene
{
List<Layer> layers;
public void draw(Graphics g)
{
for (Layer layer : layers)
layer.draw(g);
}
}
更改渲染顺序就像更改“层”中的顺序一样简单。在场景中列出。
答案 1 :(得分:1)
您是否希望将前景图像放入背景图像?如果是,那么以下代码将有所帮助:
public class Image {
public static void main(String args[]) throws IOException {
BufferedImage bgImage = ImageIO.read(new File("1.jpg"));
BufferedImage fgImage =ImageIO.read(new File("2.jpg"));
BufferedImage overlayedImage = overlay(bgImage, fgImage);
if (overlayedImage != null) {
File outputfile = new File("3.jpg");
ImageIO.write(overlayedImage, "jpg", outputfile);
} else {}
}
public static BufferedImage overlay(BufferedImage bgImage,
BufferedImage fgImage) {
Graphics2D g = bgImage.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(bgImage, 0, 0, null);
g.drawImage(fgImage, 0, 0, null);
g.dispose();
return bgImage;
}
}