[英]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);
}
}
基本上,因為游戲內容被組織成一棵樹,我想在圖層上繪制內容然后在屏幕上繪制這些圖層以便更好地排序
問題是,我只知道如何通過每次調用 function 時每層實例化 1 個緩沖圖像來做到這一點,考慮到游戲大約是 60fps 並且我有 18 層,我每秒創建 1000 個緩沖圖像......非常次優:' )
我怎樣才能以更合適的方式實現緩沖區的想法? 我聽說過Rasters
、 VolatileImage
和BufferStrategy
但我找不到我需要的信息,也無法通過 javadoc 工作
好吧,我通過列出要繪制的東西而不是緩沖圖像來繞過這個問題
以下是一些想法(未經測試):
CardLayout
使每個面板不透明BetterGlassPane
並在paintComponent
方法中使用 for 循環使用Graphics
object 繪制所有圖層。 https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.javaJLayeredPane
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.ZFC35FDC70D5FC67D53E2698JLayer
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.ZFC35FDC70D5FC69D2698838A
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.