2014-09-03 72 views
0

我正在製作一個java遊戲,它的核心是它包含一個JFrame,它包含一個保存背景圖像的JLabel。項目早期正在展示。然而,在我實現了一個將健康狀態和角色放在屏幕上的遊戲渲染方法之後,背景圖像不再顯示。這裏是Game的render()和main()方法。在Java遊戲中不顯示JLabel/JFrame的背景圖像

public class Game extends Canvas implements Runnable{ 
    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = 1200, HEIGHT = 600, SCALE = 1; 
    public static boolean running = false; 
    public Thread gameThread; 

    private BufferedImage playerSpriteSheet; 
    private ImageManager im; 

    private static Player player; 
    private static HealthBar healthBars; 

    public void init(){ 
     ImageLoader loader = new ImageLoader(); 
     playerSpriteSheet = loader.load("/spriteSheet.png"); 
     SpriteSheet pss = new SpriteSheet(playerSpriteSheet); 

     im = new ImageManager(pss); 

     player = new Player(0, 0, im); 
     healthBars = new HealthBar(200, 200); 

     this.addKeyListener(new KeyManager()); 
    } 

    public synchronized void start() { 
     if(running)return; 
     running = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 

    public synchronized void stop() { 
     if(!running)return; 
     running = false; 
     try { 
      gameThread.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void run() { 
     init(); 
     long lastTime = System.nanoTime(); 
     final double amountOfTicks = 60D; 
     double ns = 1_000_000_000/amountOfTicks; 
     double delta = 0; 
     long now = System.nanoTime(); 

     while(running) 
     { 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      if(delta >= 1) 
      { 
       tick(); 
       delta--; 
      } 
      render(); 
     } 
     stop(); 
    } 

    public void tick() { 
     player.tick(); 
    } 

    public void render() { 

     BufferStrategy bs = this.getBufferStrategy(); 
     if(bs == null) 
     { 
      createBufferStrategy(3); //Use 5 at most 
      return; 
     } 
     Graphics g = bs.getDrawGraphics(); 

     //RENDER HERE 
     player.render(g); 
     healthBars.render(g); 



     //END RENDER 
     g.dispose(); 
     bs.show(); 
    } 

    public static void main(String[] args) 
    { 
     JLabel backgroundImage; 
     JLabel controlKeyPanel; 
     JLabel statusLabel; 

     Game game = new Game(); 
     game.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
     game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
     game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 

     JFrame frame = new JFrame("Java Game"); 
     frame.setResizable(false); 
     frame.setSize(WIDTH * SCALE, HEIGHT * SCALE); 
     frame.setLayout(new BorderLayout()); 

     backgroundImage = new JLabel(new ImageIcon("/background.png")); 

     String htmlButtonGuide = "<html>&#8592 - Move Left<br>&#8594 - Move Right<br>A - Attack<br>S - Fire Gun<br>P - Position<br>esc - Exit</html>"; 
     controlKeyPanel = new JLabel(htmlButtonGuide); 

     statusLabel = new JLabel("Game Status"); 


     frame.add(backgroundImage, BorderLayout.CENTER); //This should be displaying the background image 
     frame.add(controlKeyPanel, BorderLayout.EAST); 
     frame.add(statusLabel, BorderLayout.SOUTH); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(game); 

     frame.setVisible(true); 


     game.start(); 
    } 

    public static Player getPlayer() { 
     return player; 
    } 

} 

這裏有一個問題,我認爲問題的一部分是可見的。裏面的render()方法有這兩條線:

player.render(g); 
healthBars.render(g); 

如果我把player.render(G),然後再播放機和健康條出現在屏幕上。但是,如果我在player.render(g)之前放入healthBars.render(g),那麼玩家不會出現。這讓我很困惑,因爲我期望第二個會導致第一個隱藏在後面,但是會發生相反的情況。任何人都可以將我指向正確的方向嗎?

回答

3
  • BufferStrategySwing發揮好,因爲你已經採取了噴漆工藝控制
  • Canvas不能是透明的,所以它會隱藏在它下面什麼...
  • 當你使用frame.add(game)你保換什麼都用是在BorderLayout.CENTER

而是混合輕量級(擺動),大重量(AWT)組件,繪製背景圖片作爲您的render理線的一部分s

public void render() { 

    BufferStrategy bs = this.getBufferStrategy(); 
    if(bs == null) 
    { 
     createBufferStrategy(3); //Use 5 at most 
     return; 
    } 
    Graphics g = bs.getDrawGraphics(); 

    //RENDER HERE 
    // Paint background here... 
    player.render(g); 
    healthBars.render(g); 



    //END RENDER 
    g.dispose(); 
    bs.show(); 
} 
+0

有道理。我會盡量在半小時內解決它,讓你知道它是如何發生的。 – user3750325 2014-09-03 02:22:47