如何在Java中使用两个图像?

如何在Java中使用两个图像?,java,swing,Java,Swing,我想做一个有背景的游戏。我使用了一个可移动的图像,它工作正常。以下是我的源代码: 类1(RType.java): 第2类(Board.java): 第3类(Sprite.java): 第4类(Background.java): 背景类似乎不起作用。我通过执行add(newbackground())将类添加到JFrame,但它不工作。救命?!!?movable image类工作正常 您没有提供任何约束来将零部件定向到不同的位置: add(new Background()); add(new

我想做一个有背景的游戏。我使用了一个可移动的图像,它工作正常。以下是我的源代码:

类1(RType.java):

第2类(Board.java):

第3类(Sprite.java):

第4类(Background.java):

背景类似乎不起作用。我通过执行
add(newbackground())将类添加到
JFrame
,但它不工作。救命?!!?movable image类工作正常

  • 您没有提供任何约束来将零部件定向到不同的位置:

      add(new Background());
      add(new Board());
    
    JFrame
    默认使用
    BorderLayout
    。它有
    FIRST、LAST、CENTER
    etc类型的约束来确定其组件的方向。您可以使用它们,例如:
    add(newbackground(),BorderLayout.CENTER)

  • 不要使用
    绘制(图形g)
    进行自定义绘制。重写
    paintComponent(Graphics g)
    函数,不要忘记在其内部调用
    super.paintComponent(g)

  • 那么BorderLayout(我知道它是默认的)会把背景放在角色后面吗

    不可以。大多数布局管理器都是二维的,因此不能使用同一个父面板在另一个组件上添加组件。因此,以下措施将不起作用:

         add(new Background());
         add(new Board());
    
    相反,您需要这样的代码:

    Board board = new Board();
    Background background = new Background();
    background.setLayout( new BorderLayout() );
    background.add(board);
    add(background, BorderLayout.CENTER);
    
    这仍然不起作用,因为电路板是不透明的,会在背景的顶部作画。您可以通过使电路板不透明来解决此问题

    实际上,背景/电路板应该是单个组件。它的工作是绘制背景,然后绘制精灵

    用箭头键移动精灵

    不要使用KeyListener。有关使用
    键绑定的原因和解决方案,请参阅


    另外,Swing在默认情况下是双缓冲的,因此不需要对组件进行双缓冲。

    Sage,我想要角色背后的背景。我不知道如何使用BorderLayout将背景置于角色(精灵)后面。@Thelarslog,你错误地认为我想使用
    BorderLayout
    。事实上,
    JFrame
    默认使用
    BorderLayout
    ,而不是我。因此,您将两个不同的组件添加到同一个位置,基本上是添加到
    BorderLayout.CENTER
    ,因为JFrame的add函数是默认的,所以BorderLayout也是默认的(我知道它是默认的)将背景放在角色后面,同时仍然能够用箭头键移动精灵?我认为您应该将两个图像绘制到同一个组件,并去掉另一个组件。移动图像时,您可以使用
    repaint(int x,int y,int width,int height)
    使用特定位置
    x,y
    重新绘制移动图像。要更快获得更好的帮助,请发布。
    package sprites;
    
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    
    import javax.swing.ImageIcon;
    import javax.swing.JPanel;
    
    public class Background extends JPanel {
         /**
          *
          */
         private static final long serialVersionUID = 1L;
    
         Image nook;
    
         public Background() {
              ImageIcon ii = new ImageIcon(this.getClass().getResource("nook 013.jpg"));
              nook = ii.getImage();
         }
    
         public void paint(Graphics g) {
              Graphics2D g2d = (Grahpics2D) g;
              g2d.drawImage(nook, 10, 10, null);
         }
    }
    
      add(new Background());
      add(new Board());
    
         add(new Background());
         add(new Board());
    
    Board board = new Board();
    Background background = new Background();
    background.setLayout( new BorderLayout() );
    background.add(board);
    add(background, BorderLayout.CENTER);