2014-09-03 119 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