亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號