为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java Swing 中的背景图像上绘制动画

如何在 Java Swing 中的背景图像上绘制动画

梦里花落0921 2023-04-19 16:28:31
这是我的代码,我使用了两张图片,一张用于背景图片,一张用于弹球动画,但是使用这段代码,球会在它的飞行轨迹中擦掉背景图片,所以我需要一些帮助,让我可以在transparent bufferedimage 然后将其作为背景图像的遮罩。提前致谢。import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Image;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.util.Random;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.Timer;public class MainTest {    private final int TABLE_WIDTH = 300;    private final int TABLE_HEIGHT = 400;    private final int BALL_SIZE = 16;    private JFrame f = new JFrame("Pinball game");    Random rand = new Random();    private int ySpeed = 5;    private double xyRate = rand.nextDouble() - 0.5;    private int xSpeed = (int) (ySpeed * xyRate * 2);    private int ballX = rand.nextInt(200) + 20;    private int ballY = rand.nextInt(10) + 20;    private BackgroundPanel background = new BackgroundPanel();    private Foreground foreground = new Foreground();    private int preX = -1;    private int preY = -1;    BufferedImage image = new BufferedImage(TABLE_WIDTH, TABLE_HEIGHT, BufferedImage.TYPE_INT_ARGB);    Image back = new ImageIcon("res/cat1.jpg").getImage();    Graphics g = image.getGraphics();    Timer timer;    public void init() {//      Graphics2D g = image.createGraphics();//      image = g.getDeviceConfiguration().createCompatibleImage(30, 30, Transparency.TRANSLUCENT);        background.setBackground(new ImageIcon("res/cat1.jpg"));        background.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));        foreground.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));        background.add(foreground);        f.add(background);        ActionListener taskPerformer = evt -> {            if (ballX <= 0 || ballX >= TABLE_WIDTH - BALL_SIZE) {                xSpeed = -xSpeed;            }            else if (ballY <= 0 || (ballY >= TABLE_HEIGHT - BALL_SIZE)) {                ySpeed = -ySpeed;            }
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

绘制背景图像后绘制球。

在你的情况下,在方法“processBackground”之后画球。


查看完整回答
反对 回复 2023-04-19
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我解决了这个问题,并在此处发布了代码

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import java.util.Random;


import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.Timer;


public class MainTest {


    private final int TABLE_WIDTH = 300;

    private final int TABLE_HEIGHT = 400;

    private final int BALL_SIZE = 16;

    private JFrame f = new JFrame("Pinball game");

    Random rand = new Random();

    private int ySpeed = 5;

    private double xyRate = rand.nextDouble() - 0.5;

    private int xSpeed = (int) (ySpeed * xyRate * 2);

    private int ballX = rand.nextInt(200) + 20;

    private int ballY = rand.nextInt(10) + 20;


    private BackgroundPanel background = new BackgroundPanel();   

    Timer timer;


    public void init() {


        background.setBackground(new ImageIcon("res/cat1.jpg"));

        background.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));


        f.add(background);


        ActionListener taskPerformer = evt -> {

            if (ballX <= 0 || ballX >= TABLE_WIDTH - BALL_SIZE) {

                xSpeed = -xSpeed;

            } else if (ballY <= 0 || (ballY >= TABLE_HEIGHT - BALL_SIZE)) {

                ySpeed = -ySpeed;

            }

            ballY += ySpeed;

            ballX += xSpeed;

            background.repaint();

        };

        timer = new Timer(10, taskPerformer);

        timer.start();

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.pack();

        f.setVisible(true);

    }


    public static void main(String[] args) {

        new MainTest().init();

    }


    public class BackgroundPanel extends JPanel {


        private static final long serialVersionUID = 6702278957072713279L;

        private Icon wallpaper;


        public BackgroundPanel() {

        }


        protected void paintComponent(Graphics g) {

            if (null != wallpaper) {

                processBackground(g);

                drawball(g);

            }

            System.out.println("f:paintComponent(Graphics g)");

        }


        public void setBackground(Icon wallpaper) {

            this.wallpaper = wallpaper;

            this.repaint();

        }


        private void processBackground(Graphics g) {

            ImageIcon icon = (ImageIcon) wallpaper;

            Image image = icon.getImage();

            int cw = getWidth();

            int ch = getHeight();

            int iw = image.getWidth(this);

            int ih = image.getHeight(this);

            int x = 0;

            int y = 0;

            while (y <= ch) {

                g.drawImage(image, x, y, this);

                x += iw;

                if (x >= cw) {

                    x = 0;

                    y += ih;

                }

            }

        }

        private void drawball(Graphics g){

             g.setColor(Color.BLUE);

             g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);

        }

    }

}




查看完整回答
反对 回复 2023-04-19
  • 2 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信