如何使用图形正确实现图层系统
How to implement properly a layer system using Graphics
所以我在 jpanel 上使用 自定义重绘 做一个游戏,实现如下
public synchronized void paintComp(Graphics g) {
//Buffer is a BufferedImage and it Graphics object
EnumMap<Layer,Buffer> buffers = new EnumMap<>(Layer.class);
for (Layer layer : Layer.values()) {
buffers.put(layer, new Buffer(fsize.x, fsize.y));
}
this.ltime = System.currentTimeMillis();
//there i draw all the game content on buffers' g
this.scene.render(this, buffers, ltime, 0, 0);
//then i draw all layers in the right order
for (Buffer buf : buffers.values()) {
buf.g.finalize();
g.drawImage(buf.img, offset.x, offset.y, null);
}
}
基本上,因为游戏内容是以树的形式组织的,所以我想在图层上绘制内容,然后在屏幕上绘制这些图层,以便更好地排序
问题是,我只知道如何通过每次调用该函数时每层实例化 1 个缓冲图像来做到这一点,考虑到游戏大约是 60fps 并且我有 18 个层,我每秒创建 1000 个缓冲图像...不是最理想的:')
我怎样才能以更恰当的方式实现缓冲区的想法?我听说过 Rasters
、VolatileImage
和 BufferStrategy
,但我找不到我需要的信息,也无法通过 javadoc
这里有一些想法(未测试):
- 使用
CardLayout
使每个面板不透明
- 使用
BetterGlassPane
并在 paintComponent
方法中使用 for 循环使用 Graphics
对象绘制所有图层。 https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.java
- 使用
JLayeredPane
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.html
- 使用
JLayer
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.html
好吧,我通过列出要绘制的东西而不是缓冲图像来绕过这个问题
所以我在 jpanel 上使用 自定义重绘 做一个游戏,实现如下
public synchronized void paintComp(Graphics g) {
//Buffer is a BufferedImage and it Graphics object
EnumMap<Layer,Buffer> buffers = new EnumMap<>(Layer.class);
for (Layer layer : Layer.values()) {
buffers.put(layer, new Buffer(fsize.x, fsize.y));
}
this.ltime = System.currentTimeMillis();
//there i draw all the game content on buffers' g
this.scene.render(this, buffers, ltime, 0, 0);
//then i draw all layers in the right order
for (Buffer buf : buffers.values()) {
buf.g.finalize();
g.drawImage(buf.img, offset.x, offset.y, null);
}
}
基本上,因为游戏内容是以树的形式组织的,所以我想在图层上绘制内容,然后在屏幕上绘制这些图层,以便更好地排序
问题是,我只知道如何通过每次调用该函数时每层实例化 1 个缓冲图像来做到这一点,考虑到游戏大约是 60fps 并且我有 18 个层,我每秒创建 1000 个缓冲图像...不是最理想的:')
我怎样才能以更恰当的方式实现缓冲区的想法?我听说过 Rasters
、VolatileImage
和 BufferStrategy
,但我找不到我需要的信息,也无法通过 javadoc
这里有一些想法(未测试):
- 使用
CardLayout
使每个面板不透明 - 使用
BetterGlassPane
并在paintComponent
方法中使用 for 循环使用Graphics
对象绘制所有图层。 https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.java - 使用
JLayeredPane
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.html - 使用
JLayer
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.html
好吧,我通过列出要绘制的东西而不是缓冲图像来绕过这个问题