精灵&图层

时间:2014-05-19 06:48:50

标签: java layer

所以最近我决定尝试制作某种形式的精灵游戏,类似于较旧的最终幻想游戏。我主要将此作为代码学习过程,而不是使用像RPGMaker这样的东西来实际创建一个想法。

我最关心的是如何以简单的方式正确地绘制多层图像(例如静态精灵,背景图像等)。虽然我通常只是测试一堆东西而不是询问,但我意识到有很多(可能很简单的)方法可以在编码中实现任何一件事。

实现此目的有哪些方法(或类)?最好是一种容易改变哪些层位的方式(B前面的A层......哦,不要在A前面等待B!)

我希望这不是一个问题......

感谢。

2 个答案:

答案 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;
    }
}