微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

背景图片涵盖了游戏

如何解决背景图片涵盖了游戏

我刚刚开始学习 Java,我正在尝试开发一个简单的游戏(非常像 Space Invaders)。我正在尝试为我的游戏设置背景图像,而不仅仅是为背景设置颜色。

问题:背景图像覆盖/重叠我的游戏。我再也看不到我的比赛了。我该如何解决这个问题?

相关代码

public class Board extends JPanel implements Runnable 
{

    private Player player;
    private Player2 player2;
    private EnemyWave enemyWave;
    private List<Guard> guards;

    private boolean inGame;
    private Integer lives;
    private Integer lives2;
    private String message;

    Board() 
    {

        JLabel backgroundImage;
        
        inGame=true;
        lives=3;
        lives2=3;

        player=new Player(START_X,START_Y);
        player2  =new Player2(START_X-180,START_Y);
        enemyWave = new EnemyWave();

        guards = new ArrayList<>();
        for(int i=0; i<6 ; i++) {
            guards.add(new Guard(GUARD_POSX + i * 125,GUARD_POSY));
        }


        addKeyListener(new KAdapter());
        setFocusable(true);
        //setBackground(new Color(168,219,127,116)); // Background color
        
        // BACKGROUND IMAGE
        ImageIcon img = new ImageIcon("background.jpg");
        backgroundImage = new JLabel("",img,JLabel.CENTER);
        backgroundImage.setBounds(0,1200,700);
        add(backgroundImage);
    
    setVisible(true);        
    }


    @Override
    public void addNotify() {
        super.addNotify();

        Thread animator = new Thread(this);
        animator.start();
    }

    @Override
    public void run() {

        long beforeTime,timeDiff,sleep;

        beforeTime = System.currentTimeMillis();

        while(inGame) {
            repaint();
            animationCycle();       //mechanics of a game

            timeDiff = System.currentTimeMillis() - beforeTime;
            sleep = DELAY - timeDiff;

            if(sleep<0) {
                sleep = 2;
            }
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
            beforeTime=System.currentTimeMillis();
        }
        gameOver();
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        Font font = new Font("Verdana",Font.PLAIN,18);
        g.setColor(Color.RED);
        g.setFont(font);

        g.drawString("Player 1 Lives: " + lives.toString(),BOARD_WIDTH - 185,25);
        g.drawString("Enemies Left: " + enemyWave.getNumberOfEnemies().toString(),28,25);

        g.drawString("Player 2 Lives: " + lives2.toString(),55);


        g.setColor(Color.GREEN); // border color where the plane lies
        g.drawLine(0,GROUND,BOARD_WIDTH,GROUND);

        player.draw(g,this);
        if (player.getM().isVisible())
            player.getM().draw(g,this);

        //create
        player2.draw(g,this);
        if (player2.getM().isVisible())
            player2.getM().draw(g,this);

        enemyWave.draw(g,this);

        for (Guard guard : guards) {
            guard.draw(g);
        }
    }
}

设置背景图片前:

Before

设置背景图片后(完全覆盖我的游戏):

After

解决方法

Swing 具有父/子关系。

所以一个组件将:

  1. 首先根据paintComponent(...) 方法中的绘制逻辑绘制自身。
  2. 然后绘制添加到面板的所有子组件。

在你的类的构造函数中,你有:

class Class(models.Model):
    code = models.CharField(primary_key=True,verbose_name='Code',max_length=50)

将组件添加到面板,这意味着它将在您的自定义绘画之上进行绘画。

不要在背景中使用 JLabel。

只需在paintComponent(...) 方法中绘制图像作为第一步即可。

,

在我的 Board 类中添加了这个:

Image bg = Toolkit.getDefaultToolkit().getImage("bg.jpg");

在我的paintComponent方法中添加:

g.drawImage(bg,null);

它奏效了!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。