簡體   English   中英

如何使用圖形正確實現圖層系統

[英]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 個緩沖圖像......非常次優:' )

我怎樣才能以更合適的方式實現緩沖區的想法? 我聽說過RastersVolatileImageBufferStrategy但我找不到我需要的信息,也無法通過 javadoc 工作

好吧,我通過列出要繪制的東西而不是緩沖圖像來繞過這個問題

以下是一些想法(未經測試):

  1. 使用CardLayout使每個面板不透明
  2. 使用BetterGlassPane並在paintComponent方法中使用 for 循環使用Graphics object 繪制所有圖層。 https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.java
  3. 使用JLayeredPane https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.ZFC35FDC70D5FC67D53E2698
  4. 使用JLayer https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.ZFC35FDC70D5FC69D2698838A

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM