所以我在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 個緩沖影像來做到這一點,考慮到游戲大約是 60 fps 并且我有 18 層,我每秒創建 1000 個緩沖影像......非常次優:' )
我怎樣才能以更合適的方式實作緩沖區的想法?我聽說過Rasters,但我就是找不到我需要的資訊,也找不到通過 javadoc 的VolatileImage方法BufferStrategy
uj5u.com熱心網友回復:
好吧,我通過列出要繪制的東西而不是緩沖影像來繞過這個問題
uj5u.com熱心網友回復:
以下是一些想法(未經測驗):
- 使用一個
CardLayout把每個面板不透明 - 使用
BetterGlassPaneand 在paintComponent方法中使用 for 回圈來繪制使用Graphics物件的所有圖層。https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.java - 使用
JLayeredPanehttps://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.html - 使用
JLayerhttps://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429892.html
