在C#中,我看到了SpriteBatch类(在XBOX游戏的XNA插件中)。在那个类中,它可以分层绘制。 现在我想在Java中做同样的事情,因为我正在制作编织器(参见我的其他问题),并且我有一个来自所有GameObjects的ArrayList,并且该列表不是在正确的paintoreder中制作的。
例如:我有一扇门,但门被涂在玩家身上。
马亭
答案 0 :(得分:2)
对项目列表进行排序可以解决您的问题,但如果您确实发现需要绘制图层,则可以这样做:
为每个图层创建一个BufferedImage
BufferedImage[] bi = new BufferedImage[3];
bi[0] = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
绘制到缓冲的图像
Graphics2D bg2 = bi[0].createGraphics();
bg2.drawXXX(...);
这应该都在实际的绘画方法之外。
在paint或paintComponent方法中,使用alpha合成来组合图层
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
g2.setComposite(ac);
for (int i = 0; i < bi.length; i++) {
g2.drawImage(b[i], 0, 0, this);
}
答案 1 :(得分:1)
如何在渲染之前对项目进行排序? 必须先绘制背景项,然后绘制前景项。
如果你有一个List并且项目是Comparable,你可以使用
Collections.sort(list);
如果您需要特殊订单,可以实施自己的比较器。
所有这些当然要求物品在他们的z位置上保留一些信息。
你不应该在paint方法中这样做。在项目发生变化时对其进行排序,即。加入。