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

这是我的代码,我使用了两张图片,一张用于背景图片,一张用于弹球动画,但是使用这段代码,球会在它的飞行轨迹中擦掉背景图片,所以我需要一些帮助,让我可以在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;

            }


梦里花落0921
浏览 130回答 2
2回答

万千封印

绘制背景图像后绘制球。在你的情况下,在方法“processBackground”之后画球。

慕运维8079593

我解决了这个问题,并在此处发布了代码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);        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java